生成SQL数据提取查询

0 浏览
0 试用
0 购买
Sep 28, 2025更新

根据特定条件生成SQL查询,精准高效,适用于数据分析。

示例1

下面给出一份可直接运行并易于调整的留存分析 SQL。它实现以下要求:
- 指标:7日留存(+1 至 +7 天任意一天发生 app_open 视为留存)
- 新增定义:用户的“首日 signup”为其全生命周期第一次 signup 的日期
- 时间范围:最近 30 天的新增用户,且保证7日观察窗完整(即 signup_date 在 [今天-30天, 今天-7天])
- 过滤条件:platform='ios' AND country='CN'
- AB 实验:experiment_id='onboarding_v2',按 variant 分组
- 产出:按 cohort_date(新增日期)与 variant 粒度输出新增人数、7日留存人数与留存率;同时输出 D1~D7 的逐日留存(去重用户数与占比),便于诊断

注意:以下 SQL 假设
- 事件表 app_events(user_id, event_name, event_timestamp, platform, country)
- 实验分配表 user_experiments(user_id, experiment_id, variant)
- 使用支持 DATEADD、DATEDIFF 函数的数仓(如 Snowflake/Redshift)。若为 BigQuery/Presto,请将日期函数替换为对应语法。

SQL
WITH params AS (
  SELECT
    DATEADD(day, -30, CURRENT_DATE) AS cohort_start_date,
    DATEADD(day, -7,  CURRENT_DATE) AS cohort_end_date
),
-- 仅保留 iOS/CN 的 signup 事件
signups AS (
  SELECT
    e.user_id,
    CAST(e.event_timestamp AS DATE) AS signup_date
  FROM app_events e
  WHERE e.event_name = 'signup'
    AND e.platform = 'ios'
    AND e.country  = 'CN'
),
-- 取用户全生命周期的首日 signup
first_signup AS (
  SELECT
    user_id,
    MIN(signup_date) AS first_signup_date
  FROM signups
  GROUP BY user_id
),
-- 取最近30天且可完整观察7天留存的 cohort([今天-30, 今天-7])
cohort_users AS (
  SELECT
    fs.user_id,
    fs.first_signup_date AS cohort_date
  FROM first_signup fs
  JOIN params p
    ON fs.first_signup_date BETWEEN p.cohort_start_date AND p.cohort_end_date
),
-- 限定在指定实验中的用户,并按 variant 分组
cohort_with_variant AS (
  SELECT
    cu.user_id,
    cu.cohort_date,
    ue.variant
  FROM cohort_users cu
  JOIN user_experiments ue
    ON ue.user_id = cu.user_id
   AND ue.experiment_id = 'onboarding_v2'
),
-- 仅保留 iOS/CN 的 app_open 事件
app_opens AS (
  SELECT
    e.user_id,
    CAST(e.event_timestamp AS DATE) AS open_date
  FROM app_events e
  WHERE e.event_name = 'app_open'
    AND e.platform = 'ios'
    AND e.country  = 'CN'
),
-- 连接 +1~+7 天内的 app_open,计算相对首日的天数
user_open_1_7 AS (
  SELECT
    cv.cohort_date,
    cv.variant,
    cv.user_id,
    DATEDIFF(day, cv.cohort_date, ao.open_date) AS days_since_signup
  FROM cohort_with_variant cv
  LEFT JOIN app_opens ao
    ON ao.user_id = cv.user_id
   AND ao.open_date BETWEEN DATEADD(day, 1, cv.cohort_date) AND DATEADD(day, 7, cv.cohort_date)
),
-- 汇总:新增、7日留存,以及 D1~D7 逐日留存(均为去重用户数)
cohort_agg AS (
  SELECT
    cohort_date,
    variant,
    COUNT(DISTINCT user_id) AS new_users,
    COUNT(DISTINCT CASE WHEN days_since_signup BETWEEN 1 AND 7 THEN user_id END) AS retained_7d_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 1 THEN user_id END) AS d1_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 2 THEN user_id END) AS d2_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 3 THEN user_id END) AS d3_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 4 THEN user_id END) AS d4_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 5 THEN user_id END) AS d5_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 6 THEN user_id END) AS d6_users,
    COUNT(DISTINCT CASE WHEN days_since_signup = 7 THEN user_id END) AS d7_users
  FROM user_open_1_7
  GROUP BY cohort_date, variant
)
SELECT
  cohort_date,
  variant,
  new_users,
  retained_7d_users,
  CASE WHEN new_users > 0 THEN retained_7d_users::float / new_users ELSE 0 END AS retained_7d_rate,
  -- 逐日留存占比(用于诊断,可选)
  d1_users,
  CASE WHEN new_users > 0 THEN d1_users::float / new_users ELSE 0 END AS d1_rate,
  d2_users,
  CASE WHEN new_users > 0 THEN d2_users::float / new_users ELSE 0 END AS d2_rate,
  d3_users,
  CASE WHEN new_users > 0 THEN d3_users::float / new_users ELSE 0 END AS d3_rate,
  d4_users,
  CASE WHEN new_users > 0 THEN d4_users::float / new_users ELSE 0 END AS d4_rate,
  d5_users,
  CASE WHEN new_users > 0 THEN d5_users::float / new_users ELSE 0 END AS d5_rate,
  d6_users,
  CASE WHEN new_users > 0 THEN d6_users::float / new_users ELSE 0 END AS d6_rate,
  d7_users,
  CASE WHEN new_users > 0 THEN d7_users::float / new_users ELSE 0 END AS d7_rate
FROM cohort_agg
ORDER BY cohort_date, variant;

说明与可调项
- 观察窗完整性:为避免右删截导致的低估,cohort_end_date 设为今天-7天。若需查看更近 cohort,可放宽到今天,但要注明结果受右删截影响。
- 新增口径:使用全生命周期最早的 signup 作为新增日,确保“新增=首日 signup”。若库内 signup 可能重复或有历史缺失,请先构建“首签约表”以保证一致性。
- 实验分配:假设每个用户在该实验下只有一个 variant。若存在多次分配且带有时间戳,需要在 user_experiments 中先用窗口函数挑选 signup 当时生效的一条记录。
- 性能建议:为 app_events 建立分区/聚簇(按 event_date、event_name)并尽量在 CTE 中先筛选 event_name、平台与国家,以减少扫描量。

示例2

下面给出一个可直接用于计算核心漏斗(visit → add_to_cart → purchase)的按维度(channel、app_version)汇总查询。该查询基于如下假设:
- 源表为 analytics.events(如与实际不符请替换表名)。
- 字段包含:user_id、event_name、event_time、channel、app_version、is_internal_user、region。
- 维度归因采用“首次 visit 的渠道与版本”。
- 时间窗口为最近14天内发生的事件;后续加购与购买需发生在该用户首次 visit 之后,且同样在14天窗口内。
- 漏斗第三步(purchase)仅在存在加购(add_to_cart)的前提下计数。

SQL(Snowflake/ANSI 风格):
with base as (
  select
    user_id,
    event_name,
    event_time,
    channel,
    app_version
  from analytics.events
  where is_internal_user = 0
    and region = 'CN'
    and event_time >= dateadd('day', -14, current_timestamp())
    and event_name in ('visit', 'add_to_cart', 'purchase')
),
first_visit as (
  select user_id, channel, app_version, event_time as visit_time
  from (
    select
      user_id,
      channel,
      app_version,
      event_time,
      row_number() over (partition by user_id order by event_time) as rn
    from base
    where event_name = 'visit'
  )
  where rn = 1
),
first_atc as (
  select
    fv.user_id,
    min(b.event_time) as atc_time
  from first_visit fv
  left join base b
    on b.user_id = fv.user_id
   and b.event_name = 'add_to_cart'
   and b.event_time >= fv.visit_time
  group by fv.user_id
),
first_purchase as (
  select
    fv.user_id,
    min(b.event_time) as purchase_time
  from first_visit fv
  left join first_atc fa
    on fa.user_id = fv.user_id
  left join base b
    on b.user_id = fv.user_id
   and b.event_name = 'purchase'
   and fa.atc_time is not null
   and b.event_time >= fa.atc_time
  group by fv.user_id
)
select
  fv.channel,
  fv.app_version,
  count(distinct fv.user_id) as visit_users,
  count(distinct case when fa.atc_time is not null then fv.user_id end) as add_to_cart_users,
  count(distinct case when fp.purchase_time is not null then fv.user_id end) as purchase_users,
  round(
    count(distinct case when fa.atc_time is not null then fv.user_id end)
    / nullif(count(distinct fv.user_id), 0), 4
  ) as visit_to_add_to_cart_rate,
  round(
    count(distinct case when fp.purchase_time is not null then fv.user_id end)
    / nullif(count(distinct case when fa.atc_time is not null then fv.user_id end), 0), 4
  ) as add_to_cart_to_purchase_rate,
  round(
    count(distinct case when fp.purchase_time is not null then fv.user_id end)
    / nullif(count(distinct fv.user_id), 0), 4
  ) as visit_to_purchase_rate
from first_visit fv
left join first_atc fa on fa.user_id = fv.user_id
left join first_purchase fp on fp.user_id = fv.user_id
group by 1, 2
order by 1, 2;

说明与注意事项:
- 该实现将漏斗维度归因固定在首次 visit 的 channel、app_version,确保后续步骤在同一用户的时间顺序上成立。
- 如需改为“以当日/会话为单位”的漏斗或调整14天窗口的定义(例如以首次 visit 为锚点向后滚动14天),需相应修改时间过滤与分组逻辑。
- 若使用 BigQuery,请将日期函数改为 event_time >= timestamp_sub(current_timestamp(), interval 14 day)。

示例3

以下为在未提供具体库表结构情况下的可执行范式与关键假设,并给出一版可直接运行的 BigQuery SQL(含总计与分渠道汇总)。如需迁移到其他数据仓库,请据其时间与数组函数适配。

关键假设
- 数据仓库:BigQuery(Standard SQL)
- 表与字段示例:
  - 用户表:project.dataset.user_profile(user_id, region, tags ARRAY<STRING>)
  - 点击表:project.dataset.click_events(user_id, campaign_id, channel, event_time TIMESTAMP, region)
  - 订单表:project.dataset.orders(user_id, order_id, campaign_id, channel, order_time TIMESTAMP, gmv NUMERIC, region)
- 标签筛选:tags 含任一标签(new_user 或 inactive_30d)。若需“同时包含”,将 OR 改为 AND。
- 时间范围:上周为上一个自然周(周一至周日,Asia/Shanghai)。
- 指标口径:
  - 点击->下单转化率 = 订单数 / 点击数(均为事件计数口径,未做点击-订单归因配对)。
  - 订单数 = 去重 order_id 数。
  - GMV = 订单 gmv 求和。
- 地区筛选:CN(事件和用户维度均过滤;如事件表无 region,可仅依赖用户维度)。

SQL(BigQuery)
WITH
  params AS (
    SELECT
      DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Shanghai'), INTERVAL 1 WEEK), WEEK(MONDAY)) AS week_start,
      DATE_TRUNC(CURRENT_DATE('Asia/Shanghai'), WEEK(MONDAY)) AS week_end
  ),
  eligible_users AS (
    SELECT u.user_id
    FROM `project.dataset.user_profile` u
    WHERE u.region = 'CN'
      AND (
        'new_user' IN UNNEST(u.tags)
        OR
        'inactive_30d' IN UNNEST(u.tags)
      )
    -- 若需同时包含两标签,改为:
    -- AND 'new_user' IN UNNEST(u.tags) AND 'inactive_30d' IN UNNEST(u.tags)
  ),
  clicks AS (
    SELECT
      c.channel,
      COUNT(*) AS clicks
    FROM `project.dataset.click_events` c
    CROSS JOIN params p
    JOIN eligible_users u USING (user_id)
    WHERE c.campaign_id = 'Q4_LAUNCH'
      AND c.channel IN ('ch_1', 'ch_2')
      AND c.region = 'CN'
      AND c.event_time >= TIMESTAMP(p.week_start, 'Asia/Shanghai')
      AND c.event_time <  TIMESTAMP(p.week_end,   'Asia/Shanghai')
    GROUP BY c.channel
  ),
  orders AS (
    SELECT
      o.channel,
      COUNT(DISTINCT o.order_id) AS orders,
      SUM(o.gmv) AS gmv
    FROM `project.dataset.orders` o
    CROSS JOIN params p
    JOIN eligible_users u USING (user_id)
    WHERE o.campaign_id = 'Q4_LAUNCH'
      AND o.channel IN ('ch_1', 'ch_2')
      AND o.region = 'CN'
      AND o.order_time >= TIMESTAMP(p.week_start, 'Asia/Shanghai')
      AND o.order_time <  TIMESTAMP(p.week_end,   'Asia/Shanghai')
    GROUP BY o.channel
  ),
  merged AS (
    SELECT
      ch AS channel,
      COALESCE(c.clicks, 0) AS clicks,
      COALESCE(o.orders, 0) AS orders,
      COALESCE(o.gmv, 0) AS gmv
    FROM (
      SELECT channel AS ch FROM clicks
      UNION DISTINCT
      SELECT channel AS ch FROM orders
    ) channels
    LEFT JOIN clicks c USING (channel)
    LEFT JOIN orders o USING (channel)
  )
SELECT
  channel,
  clicks,
  orders,
  SAFE_DIVIDE(orders, clicks) AS click_to_order_conv_rate,
  gmv
FROM merged
UNION ALL
SELECT
  'ALL' AS channel,
  SUM(clicks),
  SUM(orders),
  SAFE_DIVIDE(SUM(orders), SUM(clicks)),
  SUM(gmv)
FROM merged
ORDER BY channel;

实现与口径说明
- 上周时间窗:以 Asia/Shanghai 的自然周作为边界。week_start 为上周一 00:00:00,week_end 为本周一 00:00:00。
- 用户标签:假设 tags 为 ARRAY<STRING>。若为以逗号分隔的字符串,可改用 REGEXP_CONTAINS(tags, r'(^|,)new_user(,|$)') OR REGEXP_CONTAINS(tags, r'(^|,)inactive_30d(,|$)')。
- 转化率:为整体事件级转化,未做点击-订单归因配对。如需用户级转化(点击过且下过单的独立用户数 / 点击用户数),或基于点击后的 N 天归因,请说明以便调整为用户级/会话级归因模型与窗口。

适用用户

数据分析师

从运营与产品数据快速构建查询,完成留存、漏斗、AB测试结果提取,统一口径,缩短出数时间并减少SQL返工

产品经理

无需深入SQL技能即可定义指标与时间维度,一键生成核心报表查询,验证假设、追踪转化路径、定位问题环节

市场运营

基于活动规则与人群标签快速筛选与统计,分渠道对比投放效果,自动生成周报月报用于复盘与策略迭代

数据工程师

加速与业务沟通,用模板快速产出规范的只读查询,降低临时需求开发成本,减少语法差异导致的报错

商业智能(BI)分析师

统一维度与指标设置,自动生成可视化友好的SQL,直连看板数据源,提升报表上线速度与准确性

财务与风控分析

按账期、地区、客群生成精确汇总与明细,识别异常波动与风险信号,支持审计、合规与留痕需求

解决的问题

将业务口径快速、准确地转化为可直接执行的SQL查询,帮助数据分析师、产品与运营在几分钟内拿到所需数据。通过自然语言描述条件,即可生成含筛选、聚合、排序、联表等常见逻辑的标准化查询,并附带简明说明,便于审核、复用与共享。覆盖主流数据库语法,支持中英文等多语种输出,适配报表制作、增长分析、用户分群、活动复盘、漏斗与AB实验等核心场景,显著缩短从问题到数据的时间,降低错误率与沟通成本,推动试用转化与持续付费。

特征总结

输入业务条件,一键生成可执行SQL,覆盖筛选、聚合、排序、关联等常见分析需求,快速出数不绕路
自动优化查询结构,智能选择分组与过滤策略,减少数据扫描与等待时间,让报表更快上线
适配主流数据库语法,轻松切换日期与字符串函数,避免语法差异导致的查询报错与返工
同步输出步骤说明与结果解读建议,便于复盘分析路径,快速形成可落地的结论与行动项
支持多语言输出与结构化说明,内容清晰可复制,直接用于邮件、文档、工单与PRD附件
自动生成预处理流程,如去重、清洗、格式转换与异常剔除,保证分析口径一致、数据可靠
内置营销、留存、转化、AB测试等场景模板,一键套用即可获取关键指标与对比结果
按时间范围与指标维度自动组合最佳分组与窗口,轻松生成日报、周报、月报查询语句
提供安全提醒与校验逻辑,默认只读查询,降低误删误改风险,守护生产数据安全
给出可视化字段与命名建议,对齐数据字典,帮助生成更易理解的图表与报表标题

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

¥20.00元
平台提供免费试用机制,
确保效果符合预期,再付费购买!

您购买后可以获得什么

获得完整提示词模板
- 共 258 tokens
- 2 个可调节参数
{ 查询条件 } { 输出语言 }
自动加入"我的提示词库"
- 获得提示词优化器支持
- 版本化管理支持
获得社区共享的应用案例
限时免费

不要错过!

免费获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59