首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL: over子句

TSQL: over子句
EN

Stack Overflow用户
提问于 2010-02-07 13:23:38
回答 2查看 2.3K关注 0票数 4

请帮我弄清楚订单对over子句的影响。我读过msdn和一本书,但仍然被误解了。

假设我们有这样的查询:

代码语言:javascript
复制
SELECT Count(OrderID) over(Partition By Year(OrderDate))
      ,*
FROM [Northwind].[dbo].[Orders]
ORDER BY OrderDate

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

XL

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

代码语言:javascript
复制
SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
                         order by OrderDate) as RowN
      ,*
FROM [Northwind].[dbo].[Orders]
ORDER BY RowN

XL

现在,我看到了每一个RowN对于每一个值都有3个不同的年份(1996年、1997年、1998年)。我预计1996年全年的RowN值将是相同的。请解释一下发生了什么以及原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-07 13:30:26

在这种情况下:

代码语言:javascript
复制
SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
 order by OrderDate) as RowN,*
  FROM [Northwind].[dbo].[Orders]
  order by RowN

您看到的是,它给出了一个按年划分的行号,这意味着每年都有自己的爬行号。为了使这个结果更清晰一点:

代码语言:javascript
复制
SELECT ROW_NUMBER() over(Partition By Year(OrderDate)
 order by OrderDate) as RowN,*
  FROM [Northwind].[dbo].[Orders]
  order by RowN, Year(OrderDate)

这意味着,每年,比方说1997年,在year...like (这是1997年的第一次订单,1997年的第二次订单,等等)之前,订单1到n将被订购。

票数 3
EN

Stack Overflow用户

发布于 2010-02-07 13:29:40

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

代码语言:javascript
复制
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开始,按订购日期排序的行数每年都在增加:

代码语言:javascript
复制
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
...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2216878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档