SQL Academy
Premium
Funktionsreferenz

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;
member_namestatusstatus_rankstatus_dense_rank
Lela Quinceydaughter11
Annie Quinceydaughter11
Wednesday Addamsdaughter11
Headley Quinceyfather42
Ernest Forrestfather42
Flavia Quinceymother63
Constance Forrestmother63
Andie Quinceyson84

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;
categorynameprice
DrinksGreen Smoothie6.99
FoodSushi Set24.99
GroceryOlive Oil 500ml7.99
SnacksDark Chocolate4.49

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.

Siehe auch

Wo du es lernst