跳到主要内容

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=下次/下一行

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看