Ce face DENSE_RANK()
DENSE_RANK() seamănă cu RANK(), dar locurile sunt consecutive. Este potrivit când te interesează a câta valoare distinctă este, de exemplu „al doilea cel mai mare preț”.
Parametri
| Parametru | Descriere |
|---|---|
PARTITION BY |
Opțional. Clasamente separate pe grupuri. |
ORDER BY |
Criteriul clasamentului. |
Ce returnează
Locul în clasament.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE vanzari (
agent VARCHAR(20),
oras VARCHAR(20),
luna INT,
suma INT
);
INSERT INTO vanzari VALUES
('Ana', 'Iași', 1, 1200), ('Ana', 'Iași', 2, 1500), ('Ana', 'Iași', 3, 900),
('Dan', 'Cluj', 1, 900), ('Dan', 'Cluj', 2, 900), ('Dan', 'Cluj', 3, 1700),
('Ioana', 'Iași', 1, 2000), ('Ioana', 'Iași', 2, 1100);
Exemplul 1: A doua cea mai mare sumă din fiecare oraș
SELECT oras, agent, luna, suma
FROM (
SELECT *, DENSE_RANK() OVER (PARTITION BY oras ORDER BY suma DESC) AS loc
FROM vanzari
) AS t
WHERE loc = 2
ORDER BY oras, agent, luna;
Rezultat
+-------+-------+------+------+
| oras | agent | luna | suma |
+-------+-------+------+------+
| Cluj | Dan | 1 | 900 |
| Cluj | Dan | 2 | 900 |
| Iași | Ana | 2 | 1500 |
+-------+-------+------+------+
Greșeli frecvente
- Confunzi
DENSE_RANK()cuRANK()în rapoarte de premiere. Alege după regulă: la competiții se folosește de obiceiRANK().
Comenzi înrudite
RANK(): Clasament cu locuri egale la valori egale și „găuri” după ele (1, 2, 2, 4).ROW_NUMBER(): Numerotează rândurile 1, 2, 3… în fiecare grup, fără să le comprime ca GROUP BY.