请帮助我理解命令对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年的所有日期都是相同的值。请解释一下发生了什么以及为什么。
答案 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个订单等等。