Ce face RANK()
RANK() dă același loc rândurilor cu aceeași valoare, apoi sare peste locurile ocupate: după două locuri 2 urmează locul 4, ca la o competiție sportivă.
Pentru clasament fără găuri folosește DENSE_RANK().
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: Egalitățile și locurile sărite
Trei vânzări au aceeași sumă (900). RANK() le dă locul 1 tuturor și continuă cu locul 4; DENSE_RANK() continuă cu 2.
SELECT agent, luna, suma,
RANK() OVER (ORDER BY suma) AS rank_loc,
DENSE_RANK() OVER (ORDER BY suma) AS dense_loc,
ROW_NUMBER() OVER (ORDER BY suma, agent, luna) AS row_nr
FROM vanzari
ORDER BY suma, agent, luna;
Rezultat
+-------+------+------+----------+-----------+--------+
| agent | luna | suma | rank_loc | dense_loc | row_nr |
+-------+------+------+----------+-----------+--------+
| Ana | 3 | 900 | 1 | 1 | 1 |
| Dan | 1 | 900 | 1 | 1 | 2 |
| Dan | 2 | 900 | 1 | 1 | 3 |
| Ioana | 2 | 1100 | 4 | 2 | 4 |
| Ana | 1 | 1200 | 5 | 3 | 5 |
| Ana | 2 | 1500 | 6 | 4 | 6 |
| Dan | 3 | 1700 | 7 | 5 | 7 |
| Ioana | 1 | 2000 | 8 | 6 | 8 |
+-------+------+------+----------+-----------+--------+
Greșeli frecvente
- Folosești
RANK()pentru „primele 3” și primești 4 rânduri, din cauza unei egalități. E comportamentul corect; dacă vrei exact 3 rânduri, foloseșteROW_NUMBER().
Comenzi înrudite
DENSE_RANK(): Clasament cu locuri egale la valori egale, fără „găuri” (1, 2, 2, 3).ROW_NUMBER(): Numerotează rândurile 1, 2, 3… în fiecare grup, fără să le comprime ca GROUP BY.PERCENT_RANK(): Poziția relativă a unui rând, între 0 și 1: (loc − 1) / (rânduri − 1).