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