我找不到在SQL中提及Partition By
窗口函数执行顺序的任何源代码。
它与Group By
的顺序相同吗?
例如表:
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'
在逻辑上,
WHERE
在Partition by Name
函数的row_number()
之前应用。请注意,这是处理查询的逻辑顺序,不一定是引擎物理上处理数据的方式。
如果查询优化程序确定扫描整个表的价格便宜,然后根据
WHERE
过滤器丢弃日期,则可以执行此操作。但是,任何一种此类转换都必须以使最终结果与您显示的表中概述的逻辑步骤的顺序一致的方式执行。
关于sql - 与其他SQL子句相比,PARTITION BY子句的执行顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357532/