DENSE_RANK
Składnia agregatowa
dense_rank_aggregate::=
Opis ilustracji dense_rank_aggregate.gif
Składnia analityczna
dense_rank_analytic::=
Opis ilustracji dense_rank_analytic.gif
Zobacz także:
„Funkcje analityczne”, aby uzyskać informacje o składni, semantyce i ograniczeniach
Przeznaczenie
DENSE_RANK
oblicza rangę wiersza w uporządkowanej grupie wierszy i zwraca rangę jako NUMBER
. Rangi są kolejnymi liczbami całkowitymi zaczynającymi się od 1. Największą wartością rangi jest liczba unikalnych wartości zwróconych przez zapytanie. Wartości rang nie są pomijane w przypadku remisów. Wiersze z równymi wartościami kryteriów rankingowych otrzymują tę samą rangę. Funkcja ta jest przydatna do raportowania top-N i bottom-N.
Funkcja ta przyjmuje jako argumenty dowolny numeryczny typ danych i zwraca NUMBER
.
-
Jako funkcja agregująca,
DENSE_RANK
oblicza gęstą rangę hipotetycznego wiersza identyfikowanego przez argumenty funkcji w odniesieniu do danej specyfikacji sortowania. Wszystkie argumenty funkcji muszą być wyrażeniami stałymi w każdej grupie agregatów, ponieważ identyfikują pojedynczy wiersz w każdej grupie. Stałe wyrażenia argumentów i wyrażenia worder_by_clause
agregatu odpowiadają sobie według pozycji. Dlatego liczba argumentów musi być taka sama, a typy muszą być zgodne. -
Jako funkcja analityczna,
DENSE_RANK
oblicza rangę każdego wiersza zwróconego z zapytania w odniesieniu do innych wierszy, na podstawie wartościvalue_exprs
worder_by_clause
.
Przykład zbiorczy
Następujący przykład oblicza rangę hipotetycznego pracownika z pensją 15 500 USD i prowizją 5% w przykładowej tabeli oe.employees
:
SELECT DENSE_RANK(15500, .05) WITHIN GROUP (ORDER BY salary DESC, commission_pct) "Dense Rank" FROM employees; Dense Rank------------------- 3
Przykład analityczny
Następujące wyrażenie wybiera nazwę działu, nazwę pracownika i pensję wszystkich pracowników, którzy pracują w dziale zasobów ludzkich lub dziale zakupów, a następnie oblicza rangę dla każdej unikalnej pensji w każdym z dwóch działów. Wynagrodzenia, które są równe, otrzymują tę samą rangę. Porównaj ten przykład z przykładem dla RANK.
SELECT d.department_name, e.last_name, e.salary, DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary) AS drank FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id IN ('30', '40');DEPARTMENT_NAME LAST_NAME SALARY DRANK----------------------- ------------------ ---------- ----------Purchasing Colmenares 2500 1Purchasing Himuro 2600 2Purchasing Tobias 2800 3Purchasing Baida 2900 4Purchasing Khoo 3100 5Purchasing Raphaely 11000 6Human Resources Marvis 6500
Leave a Reply