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()