考虑以下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 .

推荐答案

LAG函数和一些其他函数在整个分区上操作,而不是在帧上操作.根据MySQL docs,这是"标准SQL"的一部分:

标准SQL指定在 整个分区不应该有FRAME子句.MySQL允许帧 子句,但忽略该子句.这些函数使用 整个分区,即使指定了帧也是如此

您还可以注意到,在PostgreSQL的documentation中,他们明确提到了Lag函数(重点是我的):

属性后的行偏移行的行求值. 当前行within the partition

Sql相关问答推荐

当有空单元格时,如何连接列

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

在SQL中将相同且紧挨着的元素进行分组

如何更新SQLite数据库中的表?

在数据库中搜索列

SQL子查询返回多个值错误

查询每周数据(周一至周日),避免年度日期重叠

查询页面推荐

如何用QuestDB生成蜡烛图?

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

如何将insert语句重复n次使一个值递增?

group-by-clause具有特定列,而不是oracle的toad中的all

如何在MS Access中基于另外两个表自动填充一个表中的字段?

AdventureWorks 查询

SQL Server中使用min()和max()从选定的特定值id表中删除不必要的时间

snowflake中的动态文件名生成

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

在 SQL 中使用循环遍历按时间顺序排列的数据

如何仅在满足条件时才按顺序在 SQL 中计数?

超过100名员工的连续行