RANK() în MySQL

Clasament cu locuri egale la valori egale și „găuri” după ele (1, 2, 2, 4).

Sintaxă
RANK() OVER ([PARTITION BY ...] ORDER BY ...)

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ște ROW_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).