SQLPathLab
窗口函数 · 高级

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
orders
nameamountcreated_at
Alice 1200 2026-01-03
Bob 900 2026-01-08
Cindy 1500 2026-02-02
David 700 2026-02-15

运行结果

result
nameamountprev_amount
Alice 1200 NULL
Bob 900 1200
Cindy 1500 900
David 700 1500

常见问题

窗口函数会减少结果行数吗?

不会。它在保留明细行的同时计算排名、前后值或累计结果。

排名结果为什么不稳定?

窗口 ORDER BY 存在并列值时,应增加稳定且唯一的次级排序字段。

窗口排序能保证最终展示顺序吗?

不能。需要在查询末尾再写一次 ORDER BY 才能保证输出顺序。

标签

窗口函数

这篇内容是否清楚?