1 SQL 题通用模板
题目
|
↓
统计谁?
(user_id?)
|
↓
统计什么?
(count/sum/max?)
|
↓
有没有特殊关键词?
|
+-- TopN → row_number()
|
+-- 连续 → 日期差分分组
|
+-- 累计 → sum() over()
|
+-- 留存 → join日期
|
↓
先造中间表
|
↓
最后聚合2 SQL 题分类记忆表
| 题型 | 核心函数 |
|---|---|
| 每组 Top3 | ROW_NUMBER() |
| 连续登录 | ROW_NUMBER()+DATE_SUB |
| 累计金额 | SUM() OVER |
| 环比增长 | LAG() |
| 同比 | 日期 JOIN |
| 用户留存 | 自连接 |
| 去重统计 | COUNT DISTINCT |
| 漏斗分析 | CASE WHEN |
最长连续 X 天:
连续日期 = 日期 - 排名 = 分组 = count = max
理解应该是:
连续日期中,每往后一天,日期增加 1,排名也增加 1,所以两者相减保持不变。
连续日期算法里,ROW_NUMBER() 的编号应该从 0 开始 或者统一调整,否则会影响理解。
3 SQL 真题 41
WITH t AS (
SELECT
user_id,
fdate,
DATE_SUB(
fdate,
INTERVAL (
ROW_NUMBER() OVER(
PARTITION BY user_id
ORDER BY fdate
) - 1
) DAY
) grp
FROM tb_dau
)
SELECT
user_id,
MAX(cnt) max_consec_days
FROM
(
SELECT
user_id,
grp,
COUNT(*) cnt
FROM t
GROUP BY user_id, grp
) a
GROUP BY user_id;