SQL Copilot 与表结构提示
让 AI 生成可执行 SQL 与解释
Text-to-SQL 的最佳实践
直接问 "帮我查去年的销售额" 通常会得到错误的 SQL,因为 AI 不知道你的表结构。成功的关键在于 Schema Context (表结构上下文) 的提供。
标准 Schema Prompt 模板
### 角色 你是一个高级数据分析师,熟悉 PostgreSQL 语法。 ### 表结构 1. **orders** (订单表) - order_id (PK): 字符串 - user_id: 关联 users 表 - amount: 订单金额(分) - status: 枚举值 [paid, pending, cancelled] - created_at: 时间戳 2. **users** (用户表) - user_id (PK) - source: 渠道来源 ### 任务 请帮我统计 2024 年各渠道的 GMV(已支付订单总金额),按金额降序排列。 注意:amount 单位是分,需要除以 100 转为元。
复杂查询策略
- CTE (Common Table Expressions): 强制要求 AI 使用 `WITH` 子句。这样生成的 SQL 逻辑清晰,不仅易于 AI 自我检查,也方便人工 Review。
- 逐步推导: 对极其复杂的逻辑(如归因分析),先让 AI 写中间逻辑,再合并成 SQL。
⚠️ 注意
幻觉陷阱: AI 喜欢编造字段(比如把 user_id 编成 uid)。必须强制它"只使用提供的字段,严禁猜测"。
安全性 Checklist
| 风险点 | 解决方案 |
|---|---|
| 数据泄露 | 不要上传真实数据样本,只传表结构和脱敏后的 3 行样例数据 |
| 破坏性操作 | 使用 Read-Only 账号连接数据库;Prompt 中明确 "只生成 SELECT 语句" |
| 性能爆炸 | 限制查询时间(Timeout);强制加 LIMIT |
SQL Guardrails Prompt 模板
复制即用模板
你是 SQL Copilot,仅允许输出 **SELECT** 语句。 规则: 1) 只能使用提供的字段;禁止臆造列名。 2) 必须包含时间范围过滤(>= start_date AND < end_date)。 3) 必须包含 LIMIT 1000。 4) 在 SQL 之后输出风险点清单(可能的偏差/遗漏)。 表结构:...(贴表结构与样例) 问题:...(业务问题)
结果验证与抽样
- 对账: 取 10 条样例订单,人工核对 SQL 过滤条件是否正确。
- 双路径: 同一问题用 SQL 与 Pandas 各算一遍,比对结果差异。
- 边界条件: 特别检查空值、取消订单、退款数据的处理逻辑。
常用 SQL Prompt 速查
- 同比/环比: 先聚合到月,再用窗口函数计算 Lag。
- 留存: 先得到 cohort,再 join 回行为表统计活跃。
- 漏斗: 分步骤计数,最后按步骤顺序输出。
环比模板
请生成 SQL:按月统计 GMV,并计算环比(MoM)。 要求: - 使用 WITH CTE - 输出字段:month, gmv, mom_change - 只使用订单状态=paid
行业案例:电商
电商 GMV 与复购
表结构:orders(user_id, order_id, amount, status, created_at), users(user_id, channel) 任务: 1) 按月统计 GMV(已支付) 2) 计算复购率(当月下单用户中,历史已下单占比) 要求: - 使用 CTE - amount 单位为分,需 /100 - 输出:month, gmv, repurchase_rate
电商案例补充:口径与陷阱
- GMV 口径: 是否包含退款/取消订单?常见口径为 paid 且未退款。
- 复购口径: 是否按用户去重?是否按自然月/滚动 30 天?
- 渠道口径: 用户来源是首单来源还是最后触点?
- 时间口径: created_at 是否为 UTC?是否需转时区?
⚠️ 注意
高风险陷阱: AI 容易忽略退款订单和测试订单,必须在 prompt 中明确排除。
行业案例:内容
内容发布与转化
表结构:posts(post_id, author_id, publish_at), views(post_id, user_id, view_at), orders(user_id, amount, created_at) 任务: 1) 统计每篇内容发布后 7 天的独立浏览人数 2) 统计 7 天内由这些读者产生的订单金额 要求: - 先用 CTE 计算窗口 - 只统计 view_at 在 publish_at 之后 7 天内
内容案例补充:指标定义
- 独立浏览: 按 user_id 去重;匿名用户需要 session_id 去重。
- 转化归因: 7 天内下单是否归因到该内容?是否需要最后触点?
- 内容类型: 是否需要区分图文/视频/直播?
- 发布时间: 是否过滤草稿/下线内容?