代码之家  ›  专栏  ›  技术社区  ›  Overdose

tsql:over子句

  •  4
  • Overdose  · 技术社区  · 16 年前

    请帮助我不屈不挠 按顺序 影响过度条款。我已经读过《物质安全数据表》和一本书,但仍然有误解。

    假设我们有这样的疑问:

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

    结果是,每个原始数据都有一列,其中的值是表中同一年有多少条条目。

    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

    现在我看到的唯一一件事是,每一行的每个值都有3个不同的年份(1996年、1997年、1998年)。我希望rown在1996年的所有日期都是相同的值。请告诉我发生了什么以及为什么。

    2 回复  |  直到 9 年前
        1
  •  3
  •   Nick Craver    16 年前

    在这种情况下:

    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号订单等。

        2
  •  3
  •   Mark Byers    16 年前

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

    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
    ...