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

New*_*wPy 10 sql sql-server

我找不到任何提及Partition BySQL 中窗口函数执行顺序的来源。

在此处输入图片说明

和 的顺序一样Group By吗?

例如像这样的表: 在此处输入图片说明

在此处输入图片说明

Select *, row_number() over (Partition by Name) 
from NPtable 
Where Name = 'Peter'
Run Code Online (Sandbox Code Playgroud)

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

但是当查询是:

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

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

Vla*_*nov 14

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

在你的第二个例子中

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

WHERE之前在逻辑上施加Partition by Name所述的row_number()函数。

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

如果查询优化器决定扫描整个表并稍后根据WHERE过滤器丢弃日期的成本更低,则它可以这样做。但是,任何类型的这些转换都必须以最终结果与您显示的表中列出的逻辑步骤的顺序一致的方式执行。