生成SQL数据提取查询

175 浏览
14 试用
3 购买
Nov 5, 2025更新

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

下面给出一份可直接运行并易于调整的留存分析 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、平台与国家,以减少扫描量。

下面给出一个可直接用于计算核心漏斗(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)。

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

关键假设

  • 数据仓库:BigQuery(Standard SQL)
  • 表与字段示例:
    • 用户表:project.dataset.user_profile(user_id, region, tags ARRAY)
    • 点击表: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。若为以逗号分隔的字符串,可改用 REGEXP_CONTAINS(tags, r'(^|,)new_user(,|$)') OR REGEXP_CONTAINS(tags, r'(^|,)inactive_30d(,|$)')。
  • 转化率:为整体事件级转化,未做点击-订单归因配对。如需用户级转化(点击过且下过单的独立用户数 / 点击用户数),或基于点击后的 N 天归因,请说明以便调整为用户级/会话级归因模型与窗口。

示例详情

解决的问题

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

适用用户

数据分析师

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

产品经理

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

市场运营

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

特征总结

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

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

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

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

2. 发布为 API 接口调用

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

3. 在 MCP Client 中配置使用

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

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 258 tokens
- 2 个可调节参数
{ 查询条件 } { 输出语言 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
限时免费

不要错过!

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

17
:
23
小时
:
59
分钟
:
59