lead函数必须配合over(order by…)使用,否则报错;需用partition by隔离业务分组,order by字段须具确定性(如created_at, id),offset为正整数,default类型须匹配目标列。

LEAD 不是“自动取下一行”,它只在你明确定义了逻辑顺序后,才按那个顺序返回“下一行”——没 OVER 子句直接报错,排序不稳则结果错位。
LEAD 必须带 OVER(ORDER BY …),否则报错
LEAD 是窗口函数,不是普通标量函数,数据库不允许裸用。
常见错误:SELECT id, LEAD(amount) FROM orders → 直接报错 Window function requires OVER clause。
必须写成:LEAD(amount) OVER (ORDER BY created_at) 或更稳妥的 LEAD(amount) OVER (PARTITION BY user_id ORDER BY created_at, id)。
- ORDER BY 不可省略,且字段需具业务意义(比如不能只按 id,除非 id 真实反映时序)
- 如果漏掉 PARTITION BY,跨用户/跨产品数据会串行,比如张三最后一单的 LEAD 可能拉到李四第一单
为什么 LEAD 返回一堆 NULL?多半是排序或分组没对齐
LEAD 返回 NULL 是正常语义(最后一行确实没有“下一行”),但大量 NULL 往往暴露底层问题:
- 某个分组只有一条记录 → 全部 LEAD 结果为 NULL(加 PARTITION BY 后尤其明显)
- ORDER BY 字段存在重复值(如多个订单同秒创建),数据库无法确定先后,LEAD 随机选“下一条”
- 时间字段含毫秒但显示被截断,肉眼有序,实际排序微小差异导致错位 → 建议二级排序:ORDER BY created_at, id
- WHERE 条件写在外层,导致窗口计算基于全表,但最终只保留部分行 → “下一行”被过滤掉了,LEAD 仍尝试取,结果为 NULLoffset 和 default 怎么设才不踩坑
LEAD 三个参数:LEAD(column, offset, default)
- offset 必须是常量正整数(不能是列名、子查询或表达式),LEAD(amount, 2) 合法,LEAD(amount, days_later) 报错
- default 用于越界兜底,比如环比分析时避免除零:LEAD(revenue, 1, 0);状态判断时填字符串:LEAD(status, 1, 'unknown')
- 类型要匹配:default 的类型必须和 column 兼容,否则可能隐式转换失败(尤其日期/数字混用)
真正难的不是写对语法,而是把“业务上的下一笔”精准映射成 OVER 里的 PARTITION BY 和 ORDER BY 组合——少一个字段,结果就偏一整组。










