LEAD 窗口函数详解
一、一句话理解
LEAD(列, n, 默认值) 从当前行往后数 n 行取值。好比排队时探头向前看。
二、函数语法
LEAD(列名, 偏移行数, 默认值) OVER (PARTITION BY 分组列 ORDER BY 排序列)
- 偏移行数默认 1,默认值默认 NULL
三、真实业务场景
场景1:计算用户下次购买间隔
用户订单表,算每次购买距离下一次购买的天数。
SELECT user_id, order_date,
LEAD(order_date) OVER (PARTITION BY user_id ORDER BY order_date) AS next_order_date,
DATEDIFF(LEAD(order_date) OVER (PARTITION BY user_id ORDER BY order_date), order_date) AS days_until_next
FROM orders
ORDER BY user_id, order_date;
结果:
+----------+------------+-----------------+------------------+
| user_id | order_date | next_order_date | days_until_next |
+----------+------------+-----------------+------------------+
| 1 | 2025-01-05 | 2025-01-15 | 10 |
| 1 | 2025-01-15 | 2025-02-03 | 19 |
| 1 | 2025-02-03 | NULL | NULL | ← 最后一次购买
+----------+------------+-----------------+------------------+
最后一行没有"下一行",LEAD 返回 NULL。
场景2:用户留存判断
判断新用户次日是否回来(即首次登录的下一天有无登录记录)。
WITH first_login AS (
SELECT user_id, MIN(login_date) AS first_date
FROM user_login GROUP BY user_id
)
SELECT f.user_id, f.first_date,
CASE WHEN LEAD(f.first_date) OVER (PARTITION BY f.user_id ORDER BY f.first_date) = DATE_ADD(f.first_date, 1)
THEN '留存' ELSE '流失' END AS day1_status
FROM first_login f;
四、与 LAG 的对比
| 函数 | 方向 | 典型场景 |
|---|---|---|
| LAG | 往前看(历史) | 环比、上次登录 |
| LEAD | 往后看(未来) | 下次购买、留存预测 |
五、常见坑点
坑1:最后一行的 NULL
LEAD 取下一行,最后一行必然返回 NULL。计算时需处理 NULL 或用 LEAD(col, 1, 0) 给默认值。
坑2:LEAD 不能用于实时预测
LEAD 只能用于已有数据中取"下一行"的值,不能预测未来。面试中有人混淆这个概念会被扣分。
六、面试怎么考
- "怎么算用户下次购买间隔?" → LEAD + DATEDIFF
- "怎么判断用户是否次日留存?" → LEAD 或 LEFT JOIN
- "LAG 和 LEAD 分别用在什么场景?" → LAG=环比/上一行,LEAD=下次/下一行
七、相关面试题
- 01. 股票波峰波谷 — LEAD + LAG 波峰判断
- 07. 大会员续费率 — LEAD 续费判定
- 05. 番剧追番用户留存分析 — LEAD 留存计算
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
