DENSE_RANK() în MySQL

Clasament cu locuri egale la valori egale, fără „găuri” (1, 2, 2, 3).

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

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() cu RANK() în rapoarte de premiere. Alege după regulă: la competiții se folosește de obicei RANK().

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.