TSQL: над предложением - PullRequest
       4

TSQL: над предложением

4 голосов
/ 07 февраля 2010

Пожалуйста, помогите мне понять, как порядок на влияет на предложение over. Я прочитал MSDN и одну книгу и до сих пор не понял.

Допустим, у нас есть такой запрос:

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

Результатом является то, что у каждого необработанного есть столбец со значением, сколько записей в таблице имеют один и тот же год.

альтернативный текст 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

альтернативный текст http://img -fotki.yandex.ru / get / 3908 / svin80.2 / 0_3b872_c9352fb1_XL

Теперь я вижу единственное, что у каждой строки есть 3 разных года для каждого значения (1996, 1997, 1998). Я ожидал, что значение RowN будет одинаковым для всех дат 1996 года. Пожалуйста, объясните мне, что происходит и почему.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

В этом случае:

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, упорядоченные к дате этого года ... как это было 1-го порядка 1997 г., 2-го порядка 1997 г. и т. Д.

3 голосов
/ 07 февраля 2010

Результаты будут иметь гораздо больший смысл, если вы сделаете это:

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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...