2012-02-16 11 views
20

Próbuję uzyskać over i partycji przez funkcjonalność opakowane wokół mojej głowy. Oto przykład, którego po prostu nie rozumiem.Próba zrozumienia przez() i partycji przez

Oto dane mam:

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 

Kiedy uruchomić tę kwerendę:

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

Oto wyniki uzyskać:

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 

Może ktoś wyjaśnić tej kwerendy Dla mnie. Nie jestem nowicjuszem w SQL, ale okno, z którym się zmagałem i nie mogę się z tym pogodzić.

Odpowiedz

26

Spróbuj zamawiania przez daty zamówienia, zobaczysz rezultaty łatwiej

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

powinien dać (dodałem puste wiersze dla jasności)

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 

Zauważysz, że wynik jest podzielony na "partycje", każda partycja jest zbiorem wierszy z identycznymi datami zamówienia. To właśnie oznacza "podział według zamówienia".

W obrębie partycji wiersze są sortowane według daty zamówienia, zgodnie z drugą klauzulą ​​"(partycja według porządku zamówienia według daty zamówienia)". To nie jest zbyt użyteczne, ponieważ wszystkie wiersze w obrębie partycji będą miały tę samą datę zamówienia. Z tego powodu porządkowanie wierszy w obrębie partycji jest losowe. Spróbuj uporządkować według salesorderid w klauzuli partition by uzyskać bardziej powtarzalny wynik.

ROW_NUMBER() po prostu zwraca zamawiania rzędu w ciągu każdej partycji

+1

także spróbować SELECT COUNT (*) OVER (partycji ....) może być jeszcze wyraźniejsze wam, co robi . –

+0

Dziękuję za odpowiedź. Klauzula dotycząca podziału jest bardzo silna. – Luke101

+0

Ładne i jasne dzięki! –

9

partition by orderdate oznacza, że ​​porównujesz tylko rekordy z innymi rekordami z tym samym orderdate. Na przykład z pięciu rekordów z orderdate = '08/01/2001', jeden będzie miał row_number() = 1, jeden będzie miał row_number() = 2 i tak dalej.

Parametr order by orderdate asc oznacza, że ​​w obrębie partycji numery wierszy należy przypisać w kolejności orderdate. W twoim przykładzie, który nie ma żadnego efektu, ponieważ już jesteś partycjonowany przez orderdate, więc wszystkie rekordy w partycji będą miały ten sam orderdate. (Byłoby to jak pisanie SELECT ... FROM t WHERE c = 6 ORDER BY c: wszystkie wybrane rekordy mają tę samą wartość, co c, więc ORDER BY c nic nie robi.) Tak więc, w obrębie partycji, przypisanie row_number() jest arbitralne: każdy wiersz będzie miał inną liczbę, ale nie ma gwarancje dotyczące tego, który wiersz będzie miał określoną liczbę.

+0

Ta odpowiedź powinna zostać zaakceptowany zamiast – Avi

Powiązane problemy