TSQL:over子句

时间:2010-02-07 13:23:38

标签: tsql

请帮助我理解命令对over子句的影响。我读过msdn和一本书仍然被误解了。

假设我们有这样的疑问:

SELECT Count(OrderID) over(Partition By Year(OrderDate))
      ,*
FROM [Northwind].[dbo].[Orders]
ORDER BY OrderDate

结果是每个raw都有一个列,其值为表中同一年份的条目数。

alt text http://img-fotki.yandex.ru/get/3912/svin80.2/0_3b871_3bb591da_XL

但是当我尝试这个查询时发生了什么?:

SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
                         order by OrderDate) as RowN
      ,*
FROM [Northwind].[dbo].[Orders]
ORDER BY RowN

alt text http://img-fotki.yandex.ru/get/3908/svin80.2/0_3b872_c9352fb1_XL

现在我看到每个RowN每个值有不同年份的唯一事情(1996年,1997年,1998年)。我预计RowN在1996年的所有日期都是相同的值。请解释一下发生了什么以及为什么。

2 个答案:

答案 0 :(得分:3)

如果你这样做,结果会更有意义:

SELECT
    Year(OrderDate),
    ROW_NUMBER() over(Partition By Year(OrderDate)order by OrderDate) as RowN,
    *
FROM [Northwind].[dbo].[Orders]
ORDER BY Year(OrderDate), RowN

现在您可以看到,每年从1开始增加行数,按订单日期排序:

Year RowN Order Date
1997 1    10400 1997-01-01 00:00:00
1997 2    10401 1997-01-01 00:00:00
1997 3    10402 1997-01-02 00:00:00
...
1998 1    10808 1998-01-01 00:00:00
1998 2    10809 1998-01-01 00:00:00
1998 3    10810 1998-01-01 00:00:00
...

答案 1 :(得分:3)

在这种情况下:

SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
 order by OrderDate) as RowN,*
  FROM [Northwind].[dbo].[Orders]
  order by RowN

你看到它正在给你一个按年划分的行号,这意味着每年都有它自己的爬行数。为了使结果更加清晰:

SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
 order by OrderDate) as RowN,*
  FROM [Northwind].[dbo].[Orders]
  order by RowN, Year(OrderDate)

这意味着每年,例如1997年,将在该年的日期订购1到n的订单......就像这是1997年的第1个订单,1997年的第2个订单等等。