LAG
读取上一行的值。
本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。
简介
LAG 在不做自连接的情况下读取窗口排序中前一行的值,常用于环比、状态变化和相邻事件间隔。所谓“上一行”完全由 OVER 中的 ORDER BY 决定,排序字段存在并列时必须增加稳定次级字段。第一行没有前值时返回 NULL,也可以提供默认值。
基础语法
SELECT name, amount, LAG(amount) OVER (ORDER BY created_at) AS prev_amount FROM orders;
示例
LAG 示例
按 created_at 排列订单并读取上一笔 amount,为后续计算相邻金额变化准备数据。
示例数据表
表名:
orders| name | amount | created_at |
|---|---|---|
| Alice | 1200 | 2026-01-03 |
| Bob | 900 | 2026-01-08 |
| Cindy | 1500 | 2026-02-02 |
| David | 700 | 2026-02-15 |
运行结果
| name | amount | prev_amount |
|---|---|---|
| Alice | 1200 | NULL |
| Bob | 900 | 1200 |
| Cindy | 1500 | 900 |
| David | 700 | 1500 |
常见问题
窗口函数会减少结果行数吗?
不会。它在保留明细行的同时计算排名、前后值或累计结果。
排名结果为什么不稳定?
窗口 ORDER BY 存在并列值时,应增加稳定且唯一的次级排序字段。
窗口排序能保证最终展示顺序吗?
不能。需要在查询末尾再写一次 ORDER BY 才能保证输出顺序。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。