考虑以下SQL窗口查询:
SELECT LAG(no) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) FROM account;
我想了解一下,根据ANSI标准的SQL,行为应该是什么.
就我对SQL Windows的理解而言,我们有一个分区和一个窗口框架.在这里,分区是整个表,而窗口框架只是每行的当前行.我认为在这个查询中应该出现的情况是,我们应该为每一行获得一个空值的表,因为滞后应该在没有前一行(始终只有一行)的窗口框架内进行计算.
示例:
lag |
---|
null |
null |
null |
null |
null |
null |
但是,在Postgres中运行它时,第一个值为空,然后是后面每一行的前一个帐号.
lag |
---|
null |
1 |
2 |
3 |
4 |
5 |
这表明LAG是在分区(所有数据)上执行的,而不是在窗口框架(仅在当前行)上执行的.相反,如果您为聚合函数使用sum(),则它只在窗口框架上计算它,因为它计算的是运行总数.
例如,使用总和:
lag |
---|
1 |
3 |
6 |
10 |
15 |
21 |
所以问题是:
是否有滞后(和其他一些函数?)的属性,这意味着它是在分区而不是窗口上计算的,这符合ANSI标准吗?或者是Postgres决定假设我想在这个特定的上下文中使用分区而不是窗框?
我在Postgres文档或简明的参考书中的SQL中寻找了答案,但它们似乎没有涵盖这个特定的 case .