RANK

RANK() OVER ([PARTITION BY …] ORDER BY …)

Renvoie le rang de la ligne comme dans un classement sportif : des valeurs identiques reçoivent le même rang et le rang suivant est sauté (1, 2, 2, 4).

Paramètres

  • PARTITION BY – facultatif, le rang dans chaque groupe séparément.
  • ORDER BY – ce dont dépend le rang.

Exemples

Les exemples avec les tables customers, products et orders utilisent la base de données d’exemple de la série Bases du SQL.

SELECT id, quantity,
  RANK() OVER (ORDER BY quantity DESC) AS rank_pos,
  DENSE_RANK() OVER (ORDER BY quantity DESC) AS dense_rank_pos,
  ROW_NUMBER() OVER (ORDER BY quantity DESC, id) AS row_number_pos
FROM orders
ORDER BY quantity DESC, id;
+----+----------+----------+----------------+----------------+
| id | quantity | rank_pos | dense_rank_pos | row_number_pos |
+----+----------+----------+----------------+----------------+
|  2 |        4 |        1 |              1 |              1 |
|  4 |        3 |        2 |              2 |              2 |
|  7 |        3 |        2 |              2 |              3 |
|  1 |        2 |        4 |              3 |              4 |
|  3 |        1 |        5 |              4 |              5 |
|  5 |        1 |        5 |              4 |              6 |
|  6 |        1 |        5 |              4 |              7 |
+----+----------+----------+----------------+----------------+

Points d’attention

  • Sans ORDER BY dans OVER, toutes les lignes ont le rang 1.
  • Les fonctions de fenêtrage existent dans MySQL depuis la version 8.0 et dans MariaDB depuis la 10.2. L’ancien MySQL 5.7 ne les a pas.

Voir aussi :
DENSE_RANK()
ROW_NUMBER()
NTILE()