lead不是预测函数,而是按排序取下一行值的窗口函数;必须配合order by确保时序正确,否则返回值无业务意义,且无法预测未来或填补缺失值。

LEAD 函数不是预测工具,而是取下一行值的窗口函数
直接说结论:LEAD 不做预测,只做「取值」——它从结果集的下一行读一个字段值,原样返回。所谓“对比下一期”,本质是把当前行和紧邻的下一行并排展示,靠人为观察差值或趋势。如果误把它当时间序列预测模型(比如 ARIMA 或 Prophet),会得出完全错误的结论。
常见错误现象:LEAD(sales, 2) 被当成“预测两周后销量”,其实只是取第 2 行之后那行的 sales 值;若数据没按时间排序,返回的甚至不是“下一期”而是随机行。
- 必须配合
ORDER BY在OVER()子句中显式排序,否则行为未定义 - 默认取下 1 行(
LEAD(col)等价于LEAD(col, 1)),步长可调但仍是机械偏移,不拟合任何模式 - 遇到最后一行时返回
NULL(可设默认值,如LEAD(col, 1, 0))
正确用法:按时间排序后拉出下期实际值做对比
典型场景是环比分析:比如查每月销售额,同时显示“下月销售额”和“环比变化”。关键在确保 ORDER BY 使用真实业务时间字段(如 report_date),而非自增 ID 或插入顺序。
SELECT report_date, sales, LEAD(sales) OVER (ORDER BY report_date) AS next_month_sales, LEAD(sales) OVER (ORDER BY report_date) - sales AS month_over_month_change FROM monthly_summary;
注意点:
-
report_date必须是日期类型且无重复;若有同日多条记录,需加次级排序(如ORDER BY report_date, id)保证确定性 - 如果原始数据有缺失月份(例如 2024-03 缺失),
LEAD会跳过空档直接取 2024-04,导致“下期”变成跨月而非真正下月——这时应先用生成序列补全日期再 JOIN - 性能上,
LEAD是窗口计算,对大数据量表需确保ORDER BY字段有索引
和 LAG 混用时的逻辑陷阱
有人想用 LEAD 和 LAG 套出“前后三期”,但容易写出错位表达式。例如计算三月移动平均,错误写法:(LAG(sales) + sales + LEAD(sales)) / 3 —— 这实际是“上月、本月、下月”的平均,但若数据本身不连续(缺二月),结果就失去意义。
- 真正稳健的移动平均应基于时间范围(如
AVG(sales) OVER (ORDER BY report_date RANGE BETWEEN INTERVAL '1' MONTH PRECEDING AND CURRENT ROW)),而非行偏移 -
LEAD(col, n)的n是物理行数,不是时间跨度;n=1 不代表“1天后”,只代表“结果集中下一条记录” - 在分组内使用时(如按产品分组),务必写
PARTITION BY product_id ORDER BY report_date,否则跨产品混算
替代方案:什么时候该放弃 LEAD 改用其他方法
当需求超出“取下一行”能力时,LEAD 就该让位了。例如:
- 需要预测缺失值(如插补 2024-03 销售额):用线性插值(
APPROXIMATE类函数或自连接+比例计算),或导出到 Python 用scikit-learn训练简单回归 - 要预测未来 N 期(N 超出已有数据范围):必须用建模,
LEAD对未来行根本无数据可取,返回全是NULL - 对比“去年同期”:用
LEAD(sales, 12)前提是数据严格按月对齐且无断层,更可靠的是JOIN自身表:ON a.report_date = DATE_SUB(b.report_date, INTERVAL 1 YEAR)
最容易被忽略的一点:LEAD 的输出永远受限于输入数据的完整性与时序质量。它不修复脏数据,也不理解业务逻辑——你给它乱序的日期,它就返回乱序的“下期”。










