DENSE_RANK
Gibt den Rang einer Zeile in der Fensterpartition zurück, wie RANK, aber ohne Lücken zwischen den Plätzen.
PostgreSQL 17.5
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
Rückgabewert
Ganze Zahl (bigint), 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
PostgreSQL 17.5
SELECT member_name,
status,
RANK() OVER (
ORDER BY status
) AS status_rank,
DENSE_RANK() OVER (
ORDER BY status
) AS status_dense_rank
FROM FamilyMembers;Drei höchste Preise
PostgreSQL 17.5
SELECT good,
unit_price,
price_rank
FROM (
SELECT good,
unit_price,
DENSE_RANK() OVER (
ORDER BY unit_price DESC
) AS price_rank
FROM Payments
) AS ranked
WHERE price_rank <= 3;Details
Die Funktion eignet sich, um die N größten Werte samt Gleichständen auszuwählen: Gleiche Werte teilen sich einen Platz, und die folgenden Plätze werden nicht übersprungen. Nach dem Rang filterst du in der äußeren Abfrage, denn Fensterfunktionen funktionieren nicht in WHERE.