为什么Count(*)Over(Order by <column name =“”>)可以给出一个运行的toal?

时间:2017-09-15 22:35:06

标签: sql-server tsql

我有一个包含列的表,它有四个记录:

Create Table dbo.Test(Name varchar(100));
Insert into dbo.Test Values ('A'),('B'),('C'),('D');

然后,问题是没有使用Row_Number窗口函数的行号,所以我使用:

Select Name,(Select Count(*) Over (Order By Name,NewID() Rows Between Unbounded Preceding and Current Row) as RowNumber
From dbo.Test

当然,它给了我正确的答案,但任何人都可以解释一下,为什么这可以有行号。因为我不在这里使用Partition By,所以dbo.Test表应该是一个数据集,每个记录的RowNumber应该是相同的4.请纠正我并解释一下。

1 个答案:

答案 0 :(得分:3)

你的答案在你自己的问题_ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW_中,这基本上意味着对于每一行,数据集都是当前行,所以计数应该是 rownumber

如果未设置窗口框架之前,则SQL会使用该窗口框架,如下面的示例代码所示:

declare  @Test Table(Name varchar(100));
Insert into @Test Values ('A'),('B'),('C'),('D'),('1');

SELECT Name
 , (COUNT(*) OVER (ORDER BY Name)) as RowNumberCorrect
, (COUNT(*) OVER (ORDER BY Name ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) as RowNumberCorrect2
, (COUNT(*) OVER (ORDER BY Name ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING)) as RowNumberWrong
, (COUNT(*) OVER (ORDER BY Name ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) as RowsCount
, (COUNT(*) OVER ()) as RowsCount2
FROM @Test