Count Over 根据 Order By 返回 Row_Number

Jam*_*all 3 sql-server window-functions sql-server-2014

基于我发现的一些有趣语法的快速问题。我有一个包含这些列的表:

ID INT,
DimBuyDetails_Id INT, 
WeekOfBuy INT,
Spots INT,
Retired BIT
Run Code Online (Sandbox Code Playgroud)

如果我运行此查询,我将得到ROW_NUMBER()而不是COUNT()

SELECT *
    , COUNT(ID) OVER (
        PARTITION BY DimBuyDetails_Id, WeekOfBuy
        ORDER BY ID --<
) AS ct
FROM Core.FactBuysPerWeek
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改该ORDER BY条款,我会得到COUNT()

SELECT *
    , COUNT(ID) OVER (
        PARTITION BY DimBuyDetails_Id, WeekOfBuy
        ORDER BY DimBuyDetails_Id, WeekOfBuy --<Changed Order by here
) AS ct
FROM Core.FactBuysPerWeek
Run Code Online (Sandbox Code Playgroud)

有谁知道是什么原因造成的?

Aki*_*ina 5

如果我运行此查询,我将得到 ROW_NUMBER() 而不是 COUNT()

OVER 子句 (Transact-SQL)

如果未指定 ORDER BY,则整个分区将用于窗口框架。这仅适用于不需要 ORDER BY 子句的函数。如果未指定 ROWS/RANGE 但指定了 ORDER BY,则使用 RANGE UNBOUNDED PRECEDING AND CURRENT ROW 作为窗口框架的默认值。这仅适用于可以接受可选 ROWS/RANGE 规范的函数。