Подтвердить что ты не робот

Попытка понять() и разделить на

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

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

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, но с окном, с которым я боролся, и не могу получить мою голову, обернутую вокруг этого.

4b9b3361

Ответ 1

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

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

Вы заметите, что результат делится на "разделы", причем каждый раздел представляет собой набор строк с одинаковыми порядковыми номерами. Это то, что означает "partition by orderdate".

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

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

Ответ 2

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