CUME_DIST() în MySQL

Distribuția cumulativă: ce parte din rânduri are o valoare mai mică sau egală.

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

Ce face CUME_DIST()

CUME_DIST() răspunde la întrebarea „ce procent din rânduri sunt mai mici sau egale cu acesta?”. Rezultatul este între 0 (exclusiv) și 1 (inclusiv).

Parametri

Parametru Descriere
ORDER BY Criteriul de ordonare.

Ce returnează

Un număr real între 0 și 1.

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: Câte vânzări sunt cel mult egale cu fiecare valoare

SELECT suma,
       ROUND(CUME_DIST() OVER (ORDER BY suma), 3) AS distributie,
       ROUND(PERCENT_RANK() OVER (ORDER BY suma), 3) AS pozitie_relativa
FROM vanzari
ORDER BY suma, agent;

Rezultat

+------+-------------+------------------+
| suma | distributie | pozitie_relativa |
+------+-------------+------------------+
|  900 |       0.375 |                0 |
|  900 |       0.375 |                0 |
|  900 |       0.375 |                0 |
| 1100 |         0.5 |            0.429 |
| 1200 |       0.625 |            0.571 |
| 1500 |        0.75 |            0.714 |
| 1700 |       0.875 |            0.857 |
| 2000 |           1 |                1 |
+------+-------------+------------------+

Greșeli frecvente

  • Uiți că valorile egale primesc același rezultat. Două sume de 900 au amândouă aceeași distribuție cumulativă.

Comenzi înrudite

  • PERCENT_RANK(): Poziția relativă a unui rând, între 0 și 1: (loc − 1) / (rânduri − 1).
  • NTILE(): Împarte rândurile în N grupe cât mai egale și spune în care grupă este fiecare rând.