RANK podaje ranking w ramach uporządkowanej partycji. Remisy mają tę samą rangę, z pomijaniem kolejnych rang. Tak więc, jeśli masz 3 przedmioty na randze 2, następna wymieniona pozycja będzie miała miejsce 5.
DENSE_RANK ponownie podaje ranking w uporządkowanej partycji, ale rangi następują po sobie. Żadne rangi nie są pomijane, jeśli istnieją rangi z wieloma przedmiotami.
Jeśli chodzi o wartości null, zależy to od klauzuli ORDER BY. Oto prosty skrypt testowy, dzięki któremu możesz sprawdzić, co się stanie:
with q as (
select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all
select 11, 'nnn', 20000.00 from dual union all
select 11, 'mmm', 5000.00 from dual union all
select 12, 'kkk', 30000 from dual union all
select 10, 'fff', 40000 from dual union all
select 10, 'ddd', 40000 from dual union all
select 10, 'bbb', 50000 from dual union all
select 10, 'xxx', null from dual union all
select 10, 'ccc', 50000 from dual)
select empname, deptno, sal
, rank() over (partition by deptno order by sal nulls first) r
, dense_rank() over (partition by deptno order by sal nulls first) dr1
, dense_rank() over (partition by deptno order by sal nulls last) dr2
from q;
EMP DEPTNO SAL R DR1 DR2
--- ---------- ---------- ---------- ---------- ----------
xxx 10 1 1 4
rrr 10 10000 2 2 1
fff 10 40000 3 3 2
ddd 10 40000 3 3 2
ccc 10 50000 5 4 3
bbb 10 50000 5 4 3
mmm 11 5000 1 1 1
nnn 11 20000 2 2 2
kkk 12 30000 1 1 1
9 rows selected.
Oto link do dobrego wyjaśnienia i kilku przykładów.
values
klauzuli.from dual
aby wygenerować te dane w RedshiftTen artykuł ładnie to wyjaśnia. Zasadniczo możesz spojrzeć na to jako na takie:
Powyższe przyniesie:
W słowach
ROW_NUMBER()
przypisuje unikalną wartość do każdego wierszaRANK()
przypisuje ten sam numer wiersza tej samej wartości, pozostawiając „dziury”DENSE_RANK()
przypisuje ten sam numer wiersza tej samej wartości, nie pozostawiając żadnych „dziur”źródło
źródło
rank () : Służy do uszeregowania rekordu w grupie wierszy.
dense_rank () : Funkcja DENSE_RANK działa jak funkcja RANK, z tym wyjątkiem, że przypisuje kolejne stopnie.
Zapytanie -
Wynik -
Zapytanie -
Wynik -
źródło
Row_number()
-> Służy do generowania numeru seryjnegoDense_rank()
poda stałą rangę, ale ranga pominie rangę w przypadku kolizji rang.źródło
Jedyna różnica między funkcjami RANK () i DENSE_RANK () występuje w przypadkach, gdy występuje „remis”; tj. w przypadkach, gdy wiele wartości w zestawie ma ten sam ranking. W takich przypadkach RANK () przypisze niekolejne „rangi” do wartości w zestawie (powodując przerwy między całkowitymi wartościami rankingu w przypadku remisu), podczas gdy DENSE_RANK () przypisze kolejne rangi do wartości w set (więc w przypadku remisu nie będzie żadnych luk między wartościami rankingu liczb całkowitych).
Rozważmy na przykład zbiór {25, 25, 50, 75, 75, 100}. Dla takiego zestawu RANK () zwróci {1, 1, 3, 4, 4, 6} (zwróć uwagę, że wartości 2 i 5 są pomijane), podczas gdy DENSE_RANK () zwróci {1,1,2,3, 3,4}.
źródło
Funkcja Rank () SQL generuje ranking danych w uporządkowanym zbiorze wartości, ale następna pozycja po poprzedniej rangi to numer_wiersza tego konkretnego wiersza. Z drugiej strony funkcja SQL Dense_Rank () generuje następną liczbę zamiast generować numer_wiersza. Poniżej znajduje się przykład SQL, który wyjaśni pojęcie:
Wygeneruje następujące dane wyjściowe:
źródło
Ranga i ranga zagęszczona określają pozycję w podzielonym na partycje zbiorze danych.
Rank (): Nie daje ci kolejnych liczb całkowitych.
Dense_rank (): Daje ci kolejne liczby całkowite.
Na powyższym obrazku pozycja 10008 zip wynosi 2 według funkcji dense_rank () i 24 według funkcji rank (), biorąc pod uwagę parametr row_number.
źródło
Rank(), Dense_rank(), row_number()
Wszystkie te funkcje są funkcjami okna, co oznacza, że działają one jako okno nad pewnym uporządkowanym zestawem wejściowym. Te okna mają różne funkcje dołączone do niego w zależności od wymagań. Oto powyższe 3:row_number()
Począwszy od
row_number()
tego, że stanowi to podstawę tych powiązanych funkcji okna.row_number()
jak sama nazwa wskazuje, nadaje unikalny numer zestawowi wierszy, do których został zastosowany. Podobnie jak nadanie numeru seryjnego każdemu wierszowi.Rank()
Podwersję
row_number()
można powiedzieć jakorank()
. Rank () służy do nadawania tego samego numeru seryjnego tym uporządkowanym wierszom zestawu, które są duplikatami, ale nadal utrzymuje liczbę zachowaną jako podobną do arow_number()
dla wszystkich po duplikatach rank () znaczenie jak od dołu np. Dla danych 2 row_number () = rank (), co oznacza, że oba różnią się tylko w postaci duplikatów.Wreszcie,
Dense_rank () jest rozszerzoną wersją rank (), jak nazwa sugeruje, że jest gęsty, ponieważ jak widać z powyższego przykładu rank () = dense_rank () dla wszystkich danych 1, ale tylko dla danych 2 różni się formą utrzymuje kolejność rangi () od poprzedniej rangi (), a nie rzeczywiste dane
źródło
Jedyna różnica między funkcjami RANK () i DENSE_RANK () występuje w przypadkach, gdy występuje „remis”; tj. w przypadkach, gdy wiele wartości w zestawie ma ten sam ranking. W takich przypadkach RANK () przypisze niekolejne „rangi” do wartości w zestawie (powodując przerwy między całkowitymi wartościami rankingu w przypadku remisu), podczas gdy DENSE_RANK () przypisze kolejne rangi do wartości w set (więc w przypadku remisu nie będzie żadnych luk między wartościami rankingu liczb całkowitych).
Rozważmy na przykład zbiór {30, 30, 50, 75, 75, 100}. Dla takiego zestawu RANK () zwróci {1, 1, 3, 4, 4, 6} (zwróć uwagę, że wartości 2 i 5 są pomijane), podczas gdy DENSE_RANK () zwróci {1,1,2,3, 3,4}.
źródło