LAG函数在CURRENT_ROW窗口框架下的ANSI SQL标准行为问询
LAG函数与窗口框架的ANSI SQL标准行为解析
先看你给出的SQL查询:
SELECT LAG(no) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM account;
核心结论
ANSI SQL标准明确规定:LAG、LEAD这类行定位函数的计算逻辑仅依赖于分区(partition)内的排序顺序,不受窗口框架(window frame)的约束。Postgres的行为完全符合这一标准。
关键区别:行定位函数 vs 聚合函数
- 对于SUM、AVG这类聚合函数,窗口框架定义了聚合计算的行范围(比如累计求和就是用框架控制从分区起始到当前行),这是你理解的窗口框架的作用场景。
- 而LAG、LEAD属于行定位函数,它们的设计目标是基于分区内的排序位置,找到当前行的前N行/后N行数据。这类函数不需要对某一范围的行做聚合,因此窗口框架的范围设置对它们无效——不管你把窗口框架缩到仅当前行,还是扩展到整个分区,它们都会按照分区内的排序规则去定位目标行。
对你的查询结果的解释
你指定的ROWS BETWEEN CURRENT ROW AND CURRENT ROW窗口框架,不会影响LAG函数的执行逻辑。它依然会在整个分区(这里是全表)的排序结果中,为每一行取前一行的no值:
- 首行没有前置行,返回null;
- 后续行返回分区排序后前一行的
no值。
这就是为什么你在Postgres中得到的结果和预期不同——你误将聚合函数的窗口框架逻辑套用到了行定位函数上。
内容的提问来源于stack exchange,提问作者starswap
相关产品推荐
相关产品推荐

