RANK

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

Gibt den Rang einer Zeile wie in einer Sporttabelle zurück: Gleiche Werte bekommen denselben Platz und der nächste Platz wird übersprungen (1, 2, 2, 4).

Parameter

  • PARTITION BY – optional, der Rang in jeder Gruppe getrennt.
  • ORDER BY – wonach sich der Rang richtet.

Beispiele

Die Beispiele mit den Tabellen customers, products und orders verwenden die Beispieldatenbank aus der Serie SQL-Grundlagen.

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 |
+----+----------+----------+----------------+----------------+

Worauf Sie achten sollten

  • Ohne ORDER BY in OVER haben alle Zeilen den Rang 1.
  • Fensterfunktionen gibt es in MySQL ab Version 8.0 und in MariaDB ab 10.2. Das ältere MySQL 5.7 hat sie nicht.

Siehe auch:
DENSE_RANK()
ROW_NUMBER()
NTILE()