
Pracując z bazami danych, często potrzebujemy nadać wynikiem zapytań określoną kolejność i rangę. W SQL mamy do dyspozycji różne funkcje rankingowe, a jedną z nich jest DENSE_RANK(). Czym ona się wyróżnia i jak ją właściwie stosować? W tym artykule przyjrzę się dokładnie działaniu DENSE_RANK, omówię jej zastosowania i przedstawię konkretne przykłady.
Co to jest DENSE_RANK?
DENSE_RANK() to funkcja okna (window function) w SQL, która służy do nadawania rang rekordom w obrębie określonego podziału (PARTITION BY), bazując na określonej kolejności (ORDER BY). W przeciwieństwie do klasycznej numeracji wierszy, zachowuje ona kolejność bez pominięć. Oznacza to, że jeśli dwa rekordy mają identyczną wartość sortowania, otrzymują tę samą rangę, a następny wiersz dostaje kolejność o jeden wyższą bez pominięcia wartości.
Jak działa DENSE_RANK w języku SQL?
Przyjrzyjmy się prostej tabeli zawierającej informacje o sprzedaży:
CREATE TABLE Sprzedaz (
ID INT PRIMARY KEY,
Sprzedawca VARCHAR(50),
WartoscSprzedazy DECIMAL(10,2)
);
INSERT INTO Sprzedaz (ID, Sprzedawca, WartoscSprzedazy) VALUES
(1, 'Anna', 500.00),
(2, 'Marek', 800.00),
(3, 'Karol', 800.00),
(4, 'Ewa', 600.00),
(5, 'Tomasz', 500.00),
(6, 'Kasia', 900.00);
Teraz użyjmy DENSE_RANK(), by przypisać rangę sprzedawcom według wartości sprzedaży:
SELECT
Sprzedawca,
WartoscSprzedazy,
DENSE_RANK() OVER (ORDER BY WartoscSprzedazy DESC) AS Ranga
FROM Sprzedaz;
Wynik zapytania:
| Sprzedawca | WartoscSprzedazy | Ranga |
|---|---|---|
| Kasia | 900.00 | 1 |
| Marek | 800.00 | 2 |
| Karol | 800.00 | 2 |
| Ewa | 600.00 | 3 |
| Anna | 500.00 | 4 |
| Tomasz | 500.00 | 4 |
Zwróć uwagę, że liczba rang nie zawiera przerw. Mamy dwie osoby na miejscu 2, ale kolejny wiersz otrzymuje 3, a nie 4. To jest kluczowa różnica między DENSE_RANK a RANK(), który pozostawiłby lukę w numeracji.
DENSE_RANK vs. RANK vs. ROW_NUMBER
Funkcja DENSE_RANK() jest często mylona z innymi funkcjami rankingowymi w SQL, dlatego warto porównać ich działanie:
- RANK() – przypisuje rangi identycznie jak
DENSE_RANK(), ale jeśli dwie wartości się powtarzają, następna ranga zostanie pominięta. - DENSE_RANK() – nadaje rangi kolejnym wartościom, ale nie pomija numeracji.
- ROW_NUMBER() – nadaje unikalny numer każdemu wierszowi, nawet jeśli wartości są identyczne.
Przykładowe zestawienie działania tych funkcji:
SELECT
Sprzedawca,
WartoscSprzedazy,
RANK() OVER (ORDER BY WartoscSprzedazy DESC) AS Rank,
DENSE_RANK() OVER (ORDER BY WartoscSprzedazy DESC) AS DenseRank,
ROW_NUMBER() OVER (ORDER BY WartoscSprzedazy DESC) AS RowNumber
FROM Sprzedaz;
Załóżmy, że wynik wygląda tak:
| Sprzedawca | WartoscSprzedazy | Rank | DenseRank | RowNumber |
|---|---|---|---|---|
| Kasia | 900.00 | 1 | 1 | 1 |
| Marek | 800.00 | 2 | 2 | 2 |
| Karol | 800.00 | 2 | 2 | 3 |
| Ewa | 600.00 | 4 | 3 | 4 |
| Anna | 500.00 | 5 | 4 | 5 |
| Tomasz | 500.00 | 5 | 4 | 6 |
Widzimy kilka istotnych różnic:
RANK()pominęło pozycję3, ponieważ dwóch sprzedawców miało taką samą wartość.DENSE_RANK()nie pomija liczb, dzięki czemu trzecia ranga jest poprawnie użyta.ROW_NUMBER()przypisuje unikalne numery niezależnie od wartości sprzedaży.
Gdzie warto stosować DENSE_RANK?
Funkcja DENSE_RANK() jest bardzo przydatna w różnych scenariuszach:
- Ranking sprzedawców lub produktów bez dziur w numeracji.
- Analiza sportowych tabel wyników, gdzie wielu zawodników może mieć tę samą pozycję.
- Tworzenie grup w raportach biznesowych z zachowaniem logicznej kolejności.
Podsumowanie
DENSE_RANK() to świetne narzędzie dla każdego, kto potrzebuje analizować dane rankingowe w SQL. Dzięki temu, że unika pominiętych wartości, nadaje się idealnie do raportowania i analiz, gdzie klasyfikacja jest istotna. Jeśli potrzebujesz funkcji rankingowej bez luk, DENSE_RANK() będzie najlepszym wyborem.
Inny ciekawy artykuł:
Jak działa RANK w języku SQL? Przykłady zastosowania
Opanuj SQL z moim kursem!
Poznasz zarówno podstawy, jak i zaawansowane zapytania analityczne (CTE, subqueries, window functions). Nauczysz się pracować na różnych silnikach – na kursie pracujemy zarówno na MySQL, jak i na Postgres. Wszystko zainstalujemy na Twoim komputerze, plus dostaniesz mnóstwo zestawów danych do ćwiczeń.
Zostań analitykiem danych – dołącz do KajoDataSpace!
Najlepsza ścieżka do zawodu analityka danych. Dostęp do pełnych wersji kursów online z Excela, SQLa, PowerBI, Tableau i Pythona z certyfikatami!
🟨 Ekskluzywana ale pomagająca sobie społeczność.
🟩 Ponad 75 godzin materiałów video.
🟨 Spotkania LIVE co miesiąc.
🟩 Mój osobisty mentoring.

