提问人:starswap 提问时间:4/6/2023 最后编辑:starswap 更新时间:4/7/2023 访问量:105
窗口框架上的 SQL 滞后CURRENT_ROW
SQL Lag on CURRENT_ROW Window Frame
问:
请考虑以下 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 参考书中寻找答案,但它们似乎没有涵盖这种特殊情况。
答:
评论