2012-02-16 2 views
20

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

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

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

ответ

26

Try заказа по дате заказа, вы увидите результаты более легко

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() просто возвращает порядок в Роу в пределах каждого раздела

+1

Также попробуйте SELECT COUNT (*) OVER (раздел ....) может быть еще понятней, что он делает , –

+0

Спасибо за ваш ответ. Раздел раздел очень мощный – Luke101

+0

Nice и ясное спасибо! –

9

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

+0

Этот ответ должен был быть принят вместо – Avi

Смежные вопросы