sql - 与其他SQL子句相比,PARTITION BY子句的执行顺序是什么?

标签 sql sql-server

我找不到在SQL中提及Partition By窗口函数执行顺序的任何源代码。

enter image description here

它与Group By的顺序相同吗?

例如表:
enter image description here

enter image description here

Select *, row_number() over (Partition by Name) 
from NPtable 
Where Name = 'Peter'

我知道如果首先执行Where,它将仅查看Name = 'Peter',然后执行仅聚合此特定人员而不是整个表聚合的window函数,这将更加高效。

但是当查询是:
Select top 1 *, row_number() over (Partition by Name order by Date) 
from NPtable 
Where Date > '2018-01-02 00:00:00'

是否不需要先对整个表执行window函数,然后应用Date>条件,否则结果是错误的?

最佳答案

窗口函数在表的第5阶段SELECT的同一阶段执行/计算。换句话说,窗口函数将应用于SELECT阶段中“可见”的所有行。

在第二个例子中

Select top 1 *, 
row_number() over (Partition by Name order by Date) 
from NPtable 
Where Date > '2018-01-02 00:00:00'

在逻辑上,WHEREPartition by Name函数的row_number()之前应用。

请注意,这是处理查询的逻辑顺序,不一定是引擎物理上处理数据的方式。

如果查询优化程序确定扫描整个表的价格便宜,然后根据WHERE过滤器丢弃日期,则可以执行此操作。但是,任何一种此类转换都必须以使最终结果与您显示的表中概述的逻辑步骤的顺序一致的方式执行。

关于sql - 与其他SQL子句相比,PARTITION BY子句的执行顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357532/

相关文章:

SQL Server : Unique Index on single values of two columns (! !!不是组合)

mysql - 基于page和since_id的分页

sql - 用于生成示例数据的快速 SQL 查询

sql - 更新存储过程如何具有可选参数?

sql-server - nvarchar 是否始终将每个字符存储在两个字节中?

python - 当我更新的属性是用户输入时,如何编写更新语句?

sql - 如何删除 oracle 中破折号后的文本?

sql-server - 检测查询是否在分布式事务中

sql-server - 能否将delete SQL语句转换为DBT?

sql - SQL 更新未抛出错误