PERCENT_RANK() în MySQL

Poziția relativă a unui rând, între 0 și 1: (loc − 1) / (rânduri − 1).

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

Ce face PERCENT_RANK()

PERCENT_RANK() transformă clasamentul în procent. Primul rând are 0, ultimul are 1. Formula este (RANK() − 1) / (numărul de rânduri − 1).

Parametri

Parametru Descriere
ORDER BY Criteriul clasamentului.

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: Poziția procentuală a fiecărei vânzări

SELECT agent, luna, suma,
       ROUND(PERCENT_RANK() OVER (ORDER BY suma) * 100) AS procent
FROM vanzari
ORDER BY suma, agent, luna;

Rezultat

+-------+------+------+---------+
| agent | luna | suma | procent |
+-------+------+------+---------+
| Ana   |    3 |  900 |       0 |
| Dan   |    1 |  900 |       0 |
| Dan   |    2 |  900 |       0 |
| Ioana |    2 | 1100 |      43 |
| Ana   |    1 | 1200 |      57 |
| Ana   |    2 | 1500 |      71 |
| Dan   |    3 | 1700 |      86 |
| Ioana |    1 | 2000 |     100 |
+-------+------+------+---------+

Greșeli frecvente

  • Confunzi PERCENT_RANK() cu CUME_DIST(). Primul pornește de la 0, al doilea nu ajunge niciodată la 0.

Comenzi înrudite

  • CUME_DIST(): Distribuția cumulativă: ce parte din rânduri are o valoare mai mică sau egală.
  • RANK(): Clasament cu locuri egale la valori egale și „găuri” după ele (1, 2, 2, 4).
  • NTILE(): Împarte rândurile în N grupe cât mai egale și spune în care grupă este fiecare rând.