RANK i
DENSE_RANK, co trafi na podium...
Przychodzi
audyt wewnętrzny, zewnętrzny lub inna zaraza… i prosi o dokumentację dla top 10
umów leasingowych plus tabela z informacjami o tych umowach. Inny przykładowy problem
do rozwiązania to np. wskaż 10 najlepszych sprzedawców, tu może się okazać, iż
w pierwszym kroku powinniśmy w podzapytaniu uzyskać sprzedaż agregowaną na
sprzedawcę, następnie na tym operować.
Są dwie
funkcje:
RANK () OVER
(order by …. )
DENSE_RANK () OVER (order by ….)
OVER (order by
….) są to obligatoryjne elementy użycia ww. funkcji, po tak jak w LAG I LEAD.
Jak ma być ranking, to po prostu musimy wskazać według, której kolumny ułożyć
dane, bo pamiętamy, iż w bazie dane nie są uporządkowane.
RANK nadaje
rankingi/podium w ten sposób, iż liczba osobników/umów etc. jest zgodna z
liczbą stopni podium. To znaczy, że jak np. są dwa jednakowe najlepsze wyniki,
to wówczas są dwa pierwsze miejsca, drugiego już nie ma, następne to już
trzecie miejsce.
DENSE_RANK, tu
każde miejsce podium jest, to że na pierwszym czy innym miejscu jest więcej niż
jeden osobnik/umowa nie ma znaczenia. Ta
funkcja każdy stopień podium określa i najwyżej umieszcza na stopniu więcej niż
jedną sztukę.
Innymi słowy na
początku zadaj sobie pytanie, czy chcesz 10 umów największych i kropka, wówczas
RANK. Jeżeli jednak podium ma mieć 10 stopni a umów może być więcej niż 10,
wówczas DENSE_RANK, ale czy warto więcej dokumentacji dostarczać audytorowi?
Jak dostanie mniej, to mniejsze prawdopodobieństwo, że w materiałach jest błąd.
Jak
filtrować z wykorzystanie wartości
wyprodukowanych przez użycie funkcji RANK lub DENSE_RANK?
Nie da się od
razu, trzeba zastosować CTE (użyć
klauzulę WITH na początku) i z takiej predefiniowanej tabeli wybrać kolekcję
wpisując odpowiedni warunek po WHERE lub wybrać z podzapytania i też filtrujemy
po WHERE. Obie metody dobre.
Brak komentarzy:
Prześlij komentarz