
W pracy z bazami danych często pojawia się potrzeba przypisania unikalnych numerów wierszom zwróconym w zapytaniu SQL. W takich sytuacjach przychodzi nam z pomocą funkcja ROW_NUMBER(). Jak działa ROW_NUMBER w języku SQL? Przykłady zastosowania pokażą, jak można wykorzystać tę funkcję w praktyce.
Co to jest ROW_NUMBER?
ROW_NUMBER() to funkcja okna (window function), która przypisuje unikalny numer porządkowy do każdego wiersza w wynikowym zbiorze danych. Numeracja rozpoczyna się od 1 i zwiększa się kolejno dla każdego wiersza.
Składnia funkcji ROW_NUMBER
Podstawowa składnia ROW_NUMBER() wygląda następująco:
ROW_NUMBER() OVER (ORDER BY kolumna)
Funkcja wymaga użycia klauzuli OVER, a wewnątrz niej musimy określić kolejność, według której mają być numerowane wiersze. Możemy opcjonalnie dodać klauzulę PARTITION BY, jeżeli chcemy rozpocząć numerowanie od nowa dla każdej grupy.
Podstawowy przykład użycia ROW_NUMBER
Załóżmy, że mamy tabelę Pracownicy z następującymi danymi:
| ID | Imie | Stanowisko | Pensja |
|---|---|---|---|
| 1 | Adam | Developer | 7000 |
| 2 | Beata | Developer | 7500 |
| 3 | Cezary | Manager | 9000 |
| 4 | Daria | HR | 6500 |
Chcemy przypisać każdemu pracownikowi unikalny numer wiersza zgodnie z wysokością pensji, malejąco. Możemy wykonać następujące zapytanie:
SELECT
ID,
Imie,
Stanowisko,
Pensja,
ROW_NUMBER() OVER (ORDER BY Pensja DESC) AS Numer
FROM Pracownicy;
Wynik tego zapytania będzie wyglądał następująco:
| ID | Imie | Stanowisko | Pensja | Numer |
|---|---|---|---|---|
| 3 | Cezary | Manager | 9000 | 1 |
| 2 | Beata | Developer | 7500 | 2 |
| 1 | Adam | Developer | 7000 | 3 |
| 4 | Daria | HR | 6500 | 4 |
Funkcja przypisała numery zgodnie z kolejnością zadeklarowaną w ORDER BY Pensja DESC. Wiersz z największą pensją otrzymał numer 1.
Numerowanie wierszy w grupach za pomocą PARTITION BY
Jeśli chcemy numerować wiersze w ramach określonych grup, możemy dodać PARTITION BY. Załóżmy, że chcemy ponownie numerować pracowników, ale osobno dla każdego stanowiska:
SELECT
ID,
Imie,
Stanowisko,
Pensja,
ROW_NUMBER() OVER (PARTITION BY Stanowisko ORDER BY Pensja DESC) AS Numer
FROM Pracownicy;
Rezultat będzie wyglądał następująco:
| ID | Imie | Stanowisko | Pensja | Numer |
|---|---|---|---|---|
| 2 | Beata | Developer | 7500 | 1 |
| 1 | Adam | Developer | 7000 | 2 |
| 3 | Cezary | Manager | 9000 | 1 |
| 4 | Daria | HR | 6500 | 1 |
W tym przypadku ROW_NUMBER() resetuje numerację dla każdej wartości w kolumnie Stanowisko. Developerzy są numerowani osobno, managerowie osobno itd.
Praktyczne zastosowania ROW_NUMBER
Funkcja ROW_NUMBER() jest niezwykle przydatna w wielu scenariuszach:
- Usuwanie duplikatów – Możemy użyć jej do identyfikowania i usuwania powtarzających się rekordów.
- Paginacja wyników – W połączeniu z
WHEREpozwala na zwracanie określonego zakresu wierszy, np. dla stronicowania w aplikacjach webowych. - Wybór n-tego rekordu – Możemy łatwo pobrać np. drugi lub trzeci najlepszy wynik.
Różnice między ROW_NUMBER, RANK i DENSE_RANK
W SQL istnieją również inne funkcje numerujące, które działają podobnie do ROW_NUMBER, ale mają pewne różnice:
| Funkcja | Opis |
|---|---|
ROW_NUMBER() |
Nadaje unikalną numerację każdemu wierszowi. |
RANK() |
Przy jednakowych wartościach przypisuje ten sam numer, ale kolejne numery mogą mieć luki. |
DENSE_RANK() |
Podobny do RANK(), ale nie pozostawia luk w numeracji. |
Przykładowo, przy sortowaniu według pensji:
SELECT
ID,
Imie,
Pensja,
ROW_NUMBER() OVER (ORDER BY Pensja DESC) AS RowNum,
RANK() OVER (ORDER BY Pensja DESC) AS RankNum,
DENSE_RANK() OVER (ORDER BY Pensja DESC) AS DenseRankNum
FROM Pracownicy;
Wyniki pokażą, jak każda z funkcji różni się między sobą.
Podsumowanie
Funkcja ROW_NUMBER() w języku SQL to niezwykle przydatne narzędzie do numerowania wierszy według dowolnej kolejności i podziału na grupy. Warto znać jej zastosowania, takie jak paginacja, usuwanie duplikatów czy wybór konkretnych rekordów.
Inny ciekawy artykuł:
Jak działa DENSE_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.

