Пытаясь понять over () и разделить - PullRequest
23 голосов
/ 16 февраля 2012

Я пытаюсь перебрать и разделить по функциональности, обернутой вокруг моей головы. Вот пример, который я просто не понимаю.

Вот данные, которые у меня есть:

SALESORDERID       ORDERDATE 
43894              08/01/2001 
43664              07/01/2001 
43911              08/01/2001 
43867              08/01/2001 
43877              08/01/2001 
44285              10/01/2001 
44501              11/01/2001 
43866              08/01/2001 
43895              08/01/2001 
43860              08/01/2001

Когда я запускаю этот запрос:

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by rownumber

Вот результаты, которые я получаю:

ROWNUMBER     SALESORDERID       ORDERDATE 
1             43664              07/01/2001 
1             43911              08/01/2001 
1             44109              09/01/2001 
1             44483              11/01/2001 
1             44285              10/01/2001 
2             43867              08/01/2001 
2             44501              11/01/2001 
3             43895              08/01/2001 
4             43894              08/01/2001 
5             43877              08/01/2001 

Может кто-нибудь объяснить мне этот вопрос. Я не новичок в SQL, но с окнами, с которыми я боролся и не могу обернуться вокруг этого.

Ответы [ 2 ]

35 голосов
/ 16 февраля 2012

Попробуйте оформить заказ по дате заказа, результаты вы увидите легче

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by orderdate;

должно дать (я добавил пустые строки для ясности)

ROWNUMBER     SALESORDERID       ORDERDATE
1             43664              07/01/2001

1             43911              08/01/2001
2             43867              08/01/2001
3             43895              08/01/2001
4             43894              08/01/2001
5             43877              08/01/2001

1             44109              09/01/2001

1             44285              10/01/2001

1             44483              11/01/2001
2             44501              11/01/2001

Вы заметите, что результат делится на «разделы», причем каждый раздел представляет собой набор строк с одинаковыми датами заказа. Вот что означает «разделение по дате заказа».

Внутри раздела строки упорядочены по дате заказа согласно второму пункту «(раздел по порядку даты по дате заказа asc)». Это не очень полезно, так как все строки в разделе будут иметь одинаковую дату заказа. Из-за этого порядок строк в разделе является случайным. Попробуйте упорядочить по salesorderid в разделе «раздел по предложению», чтобы получить более воспроизводимый результат.

row_number () просто возвращает порядок строк в каждом разделе

12 голосов
/ 16 февраля 2012

partition by orderdate означает, что вы сравниваете записи только с другими записями с таким же orderdate.Например, из пяти записей с orderdate = '08/01/2001' одна будет иметь row_number() = 1, одна будет иметь row_number() = 2 и т. Д.

order by orderdate asc означает, что в пределах раздела номера строкназначаются в порядке orderdate.В вашем примере это не имеет никакого эффекта, поскольку вы уже разбиваете на orderdate, поэтому все записи в пределах раздела будут иметь одинаковые значения orderdate.(Это будет похоже на запись SELECT ... FROM t WHERE c = 6 ORDER BY c: все выбранные записи имеют одинаковое значение c, поэтому ORDER BY c ничего не делает.) Таким образом, в пределах раздела присвоение row_number() является произвольным: каждая строка будет иметьдругой номер, но нет никаких гарантий относительно того, какая строка будет иметь какой номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...