DENSE_RANK
Gibt den Rang einer Zeile in der Fensterpartition zurück, wie RANK, aber ohne Lücken zwischen den Plätzen.
MySQL 8.1
DENSE_RANK() OVER ([PARTITION BY ...] [ORDER BY ...])Parameter
- PARTITION BYoptional
- Spalten, nach denen die Zeilen in Partitionen aufgeteilt werden; die Ränge werden in jeder separat berechnet
- ORDER BYoptional
- Reihenfolge der Zeilen, die den Platz bestimmt; ohne sie haben alle Zeilen Rang 1
Rückgabewert
Ganze Zahl (BIGINT UNSIGNED), der Platz der Zeile; gleiche Werte teilen sich einen Platz, der nächste Platz ist um eins größer: 1, 2, 2, 3
Beispiele
DENSE_RANK und RANK nach Status
MySQL 8.1
SELECT member_name,
status,
RANK() OVER (
ORDER BY status
) AS status_rank,
DENSE_RANK() OVER (
ORDER BY status
) AS status_dense_rank
FROM FamilyMembers;Teuerste Waren in jeder Kategorie
MySQL 8.1
SELECT category,
name,
price
FROM (
SELECT category,
name,
price,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY price DESC
) AS price_rank
FROM products
) AS ranked
WHERE price_rank = 1;Details
Praktisch, um den N-größten Wert zu finden: Zeilen mit DENSE_RANK() = 2 enthalten den zweiten Wert, auch wenn der erste mehrmals vorkommt. Nach dem Rang filterst du in der äußeren Abfrage: In WHERE derselben Abfrage kannst du keine Fensterfunktionen verwenden.