
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
WHERE
pozwala 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, Tableau i Pythona z certyfikatami + specjalistycznych webinarów z PowerBI.
Ekskluzywana ale pomagająca sobie społeczność.
Ponad 61 godzin materiałów video.
Spotkania LIVE co miesiąc.
Mój osobisty mentoring.