Jak działa ROW_NUMBER w języku SQL? Przykłady zastosowania

Jak działa ROW_NUMBER w języku SQL? Przykłady zastosowania

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

KajoDataSpace