窗口框架上的 SQL 滞后CURRENT_ROW

SQL Lag on CURRENT_ROW Window Frame

提问人:starswap 提问时间:4/6/2023 最后编辑:starswap 更新时间:4/7/2023 访问量:105

问:

请考虑以下 SQL 窗口查询:

SELECT LAG(no) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM account;

我想了解根据 ANSI 标准 SQL 的行为应该是什么。

在我理解 SQL 窗口的方式中 [https://learnsql.com/blog/sql-window-functions-cheat-sheet/ 证实] 我们有一个分区和一个窗口框架。这里的分区是整个表,窗口框架只是每行的当前行。我认为在这个查询中应该发生的事情是,我们应该为每一行获得一个带有 null 的表,因为 LAG 应该在窗口框架内进行评估,其中没有前一行(总是只有 1 行)。

例:

滞后

但是,在 Postgres 中运行它,我得到第一个值的 null,然后是后面每一行的前一个帐号。

滞后
1
2
3
4
5

这表明 LAG 是在分区(所有数据)上执行的,而不是在窗口框架(仅当前行)上执行的。相反,如果将 SUM() 用于聚合函数,则它只会在窗口框架上计算它,因为它会计算运行总计。

例如,对于 SUM 聚合:

滞后
1
3
6
10
15
21

所以问题是:

LAG是否有属性(和其他一些函数?),这意味着它是在分区而不是窗口上计算的,这是否符合ANSI标准?或者 Postgres 决定假设我想在这个特定上下文中使用分区而不是窗口框架?

我在 Postgres 文档或 SQL in a Nutshell 参考书中寻找答案,但它们似乎没有涵盖这种特殊情况。

ANSI-SQL

评论


答:

2赞 Abdul Aziz Barkat 4/6/2023 #1

该函数和其他一些函数对整个分区(而不是帧)进行操作。根据MySQL文档,这是“标准SQL”的一部分:LAG

标准 SQL 指定在 整个分区不应有 frame 子句。MySQL允许一个框架 子句,但忽略它。这些函数使用 整个分区,即使指定了帧

您还可以在PostgreSQL的文档中注意到他们明确提到的函数(强调我的):Lag

返回在偏移行后面的行处计算的值 分区中的当前行

评论

0赞 starswap 4/7/2023
太好了 - 重点有助于:)谢谢