1 SQL 题通用模板

题目
 |
 ↓
统计谁?
(user_id?)
 |
 ↓
统计什么?
(count/sum/max?)
 |
 ↓
有没有特殊关键词?
 |
 +-- TopN → row_number()
 |
 +-- 连续 → 日期差分分组
 |
 +-- 累计 → sum() over()
 |
 +-- 留存 → join日期
 |
 ↓
先造中间表
 |
 ↓
最后聚合

2 SQL 题分类记忆表

题型核心函数
每组 Top3ROW_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;