Problem:
Chcesz nadać każdemu wierszowi w tabeli wyników osobny numer.
Przykład:
Nasza baza danych zawiera tabelę o nazwie furniture
z danymi w następujących kolumnach:code
(klucz podstawowy) i name
.
kod | imię |
---|---|
101 | łóżko |
202 | sofa |
333 | krzesło |
123 | regał |
235 | stół |
766 | biurko |
furniture
tabela przechowuje nazwy mebli, które chcemy ponumerować.
Rozwiązanie:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Zapytanie zwraca numer wiersza każdego mebla wraz z jego nazwą i kodem:
num_row | imię | kod |
---|---|---|
1 | łóżko | 101 |
2 | sofa | 202 |
3 | krzesło | 333 |
4 | regał | 123 |
5 | stół | 235 |
6 | biurko | 766 |
Pamiętaj, że nazwy mebli nie są sortowane.
Dyskusja:
Jeśli chcesz ponumerować każdy wiersz w zestawie wyników, SQL udostępnia ROW_NUMBER()
funkcjonować. Ta funkcja jest używana w SELECT
klauzula z innymi kolumnami. Po ROW_NUMBER()
klauzulę, wywołujemy OVER()
funkcjonować. Jeśli przekażesz jakiekolwiek argumenty do OVER
, numeracja wierszy nie będzie sortowana według żadnej kolumny. Tak więc kolejność wyświetlanych wierszy będzie niedeterministyczna; w większości przypadków jest to kolejność wstawiania rekordów do tabeli. Numeracja wierszy zaczyna się od 1. W naszym przykładzie każdy rekord ma numer od 1 do 6.
Możemy również przypisać numery rzędów za pomocą kolumny. W poniższym przykładzie numerujemy rekordy posortowane według nazwy. Robimy to, przekazując ten argument do OVER
wraz z ORDER BY
(sortuje rekordy według kolumny nazwy):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Gdy patrzysz na zestaw wyników, widzisz posortowane wiersze z ich numerami:
wiersz | imię | kod |
---|---|---|
1 | łóżko | 101 |
2 | regał | 123 |
3 | krzesło | 333 |
4 | biurko | 766 |
5 | sofa | 202 |
6 | stół | 235 |
Numeracja dostarczona przez ROW_NUMBER()
jest niezależna od kolejności wierszy w tabeli wynikowej. W poniższym przykładzie numerujemy rekordy używając posortowanej nazwy kolumny (OVER(ORDER BY name)
), ale wyświetlamy rekordy w zestawie wyników zgodnie z inną kolumną (w naszym przykładzie ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Zapytanie zwróciło liczbę w każdym wierszu, ale liczby te nie są w kolejności rosnącej, ponieważ rekordy są sortowane według kodu kolumny:
wiersz | imię | kod |
---|---|---|
1 | łóżko | 101 |
2 | regał | 123 |
5 | sofa | 202 |
6 | stół | 235 |
3 | krzesło | 333 |
4 | biurko | 766 |
Domyślna kolejność posortowanych wierszy jest rosnąca, ale możesz także sortować w kolejności malejącej za pomocą DESC
słowo kluczowe po nazwie kolumny, według której chcesz sortować:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Powyższe zapytanie zwróciło zestaw wyników:
wiersz | imię | kod |
---|---|---|
4 | biurko | 766 |
3 | krzesło | 333 |
6 | stół | 235 |
5 | sofa | 202 |
2 | regał | 123 |
1 | łóżko | 101 |