V SQL Server, ROW_NUMBER()
Funkce umožňuje očíslovat výstup sady výsledků. Vrátí pořadové číslo každého řádku počínaje 1.
Pokud zadáte oddíly pro sadu výsledků, každý oddíl způsobí, že číslování začne znovu (tj. číslování bude začínat na 1 pro první řádek v každém oddílu).
Syntaxe
Syntaxe vypadá takto:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
PARTITION BY value_expression
je volitelný. Rozdělí výslednou sadu vytvořenou FROM
klauzule do oddílů, na které je funkce aplikována. výraz_hodnoty určuje sloupec, podle kterého je výsledná sada rozdělena. Pokud PARTITION BY
klauzule není specifikována, jsou všechny řádky sady výsledků dotazu považovány za jednu skupinu.
ROW_NUMBER
v určeném oddílu.
Všimněte si, že OVER
klauzule normálně přijímá klauzuli
Příklad 1 – Základní použití
Zde je základní příklad ukazující, jak tato funkce funguje:
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM Albums;
Výsledek:
+-------+-----------+-------------------------- +| Řádek | AlbumId | Název alba ||-------+-----------+--------------------------| | 1 | 1 | Powerslave || 2 | 2 | Výkon || 3 | 3 | Singing Down the Lane || 4 | 4 | Ziltoid vševěd || 5 | 5 | Oběti Cool || 6 | 6 | Epicloud || 7 | 7 | Někde v čase || 8 | 8 | Kousek mysli || 9 | 9 | Zabijáci || 10 | 10 | Žádná modlitba za umírající || 11 | 11 | Žádný zvuk bez ticha || 12 | 12 | Big Swing Face || 13 | 13 | Modrá noc || 14 | 14 | Věčnost || 15 | 15 | Skandinávie || 16 | 16 | Dlouho ztracený kufr || 17 | 17 | Chvála a vina || 18 | 18 | Along Came Jones || 19 | 19 | Celá noc špatně || 20 | 20 | Šestnáct mužů z Tainu || 21 | 21 | Yo Wassup || 22 | 22 | Rozbitý |+-------+-----------+--------------------------+
V tomto případě vidíme, že čísla řádků dokonale odpovídají hodnotám v AlbumId
sloupec. To je čistě náhodné. K tomu dochází, protože AlbumId
sloupec používá rostoucí hodnotu začínající na 1, což je také ROW_NUMBER()
používá.
Číslování řádků koreluje s AlbumId
sloupec v rozsahu, v jakém je seřazen podle tohoto sloupce. Ale to neznamená, že hodnoty musí být stejné.
Příklad 2 – Přidání klauzule WHERE
Přidání WHERE
doložka ukáže, co tím myslím.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsWHERE AlbumId> 15;
Výsledek:
+-------+-----------+-------------------------+ | Řádek | AlbumId | Název alba ||-------+-----------+-------------------------|| 1 | 16 | Dlouho ztracený kufr || 2 | 17 | Chvála a vina || 3 | 18 | Along Came Jones || 4 | 19 | Celá noc špatně || 5 | 20 | Šestnáct mužů z Tainu || 6 | 21 | Yo Wassup || 7 | 22 | Rozbitý |+-------+-----------+-------------------------+Příklad 3 – Změna řazení
Tento koncept také demonstruje řazení sestupně místo vzestupně.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId DESC) 'Row', AlbumId, AlbumNameFROM Albums;Výsledek:
+-------+-----------+-------------------------- +| Řádek | AlbumId | Název alba ||-------+-----------+--------------------------| | 1 | 22 | Zatčen || 2 | 21 | Yo Wassup || 3 | 20 | Šestnáct mužů z Tainu || 4 | 19 | Celá noc špatně || 5 | 18 | Along Came Jones || 6 | 17 | Chvála a vina || 7 | 16 | Dlouho ztracený kufr || 8 | 15 | Skandinávie || 9 | 14 | Věčnost || 10 | 13 | Modrá noc || 11 | 12 | Big Swing Face || 12 | 11 | Žádný zvuk bez ticha || 13 | 10 | Žádná modlitba za umírající || 14 | 9 | Zabijáci || 15 | 8 | Kousek mysli || 16 | 7 | Někde v čase || 17 | 6 | Epicloud || 18 | 5 | Oběti Cool || 19 | 4 | Ziltoid vševěd || 20 | 3 | Singing Down the Lane || 21 | 2 | Výkon || 22 | 1 | Powerslave |+-------+-----------+--------------------------+Příklad 4 – Seřazení podle jiného sloupce
A když už jsme u toho, pojďme seřadit podle
AlbumName
místo toho.SELECT ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Row', AlbumId, AlbumNameFROM Albums;Výsledek:
+-------+-----------+-------------------------- +| Řádek | AlbumId | Název alba ||-------+-----------+--------------------------| | 1 | 19 | Celá noc špatně || 2 | 18 | Along Came Jones || 3 | 12 | Big Swing Face || 4 | 13 | Modrá noc || 5 | 22 | Zatčen || 6 | 5 | Oběti Cool || 7 | 6 | Epicloud || 8 | 14 | Věčnost || 9 | 9 | Zabijáci || 10 | 16 | Dlouho ztracený kufr || 11 | 10 | Žádná modlitba za umírající || 12 | 11 | Žádný zvuk bez ticha || 13 | 8 | Kousek mysli || 14 | 2 | Výkon || 15 | 1 | Powerslave || 16 | 17 | Chvála a vina || 17 | 15 | Skandinávie || 18 | 3 | Singing Down the Lane || 19 | 7 | Někde v čase || 20 | 20 | Šestnáct mužů z Tainu || 21 | 21 | Yo Wassup || 22 | 4 | Ziltoid vševěd |+-------+-----------+------------------------- -+Příklad 5 – Oddíly
Jak již bylo zmíněno, výsledky můžete také rozdělit do oddílů. Když to uděláte, číslování začíná znovu od 1 pro každý nový oddíl.
Příklad:
SELECT Genre, ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsINNER JOIN Genres ON Albums.GenreId =Genres.GenreId;Výsledek:
+---------+-------+-----------+---------------- ----------+| Žánr | Řádek | AlbumId | Název alba ||---------+-------+-----------+----------------- ---------|| Země | 1 | 3 | Singing Down the Lane || Země | 2 | 21 | Yo Wassup || Země | 3 | 22 | Zatčen || Jazz | 1 | 12 | Big Swing Face || Jazz | 2 | 19 | Celá noc špatně || Jazz | 3 | 20 | Šestnáct mužů z Tainu || Pop | 1 | 11 | Žádný zvuk bez ticha || Pop | 2 | 13 | Modrá noc || Pop | 3 | 14 | Věčnost || Pop | 4 | 15 | Skandinávie || Pop | 5 | 16 | Dlouho ztracený kufr || Pop | 6 | 17 | Chvála a vina || Pop | 7 | 18 | Along Came Jones || Rock | 1 | 1 | Powerslave || Rock | 2 | 2 | Výkon || Rock | 3 | 4 | Ziltoid vševěd || Rock | 4 | 5 | Oběti Cool || Rock | 5 | 6 | Epicloud || Rock | 6 | 7 | Někde v čase || Rock | 7 | 8 | Kousek mysli || Rock | 8 | 9 | Zabijáci || Rock | 9 | 10 | Žádná modlitba za umírající |+---------+-------+-----------+------------- -------------+Znovu vidíme, že
ROW_NUMBER
aAlbumId
sloupce jsou zcela nekorelované.V tomto případě rozděluji podle
Genre
sloupec. To způsobí, že číslování začne znovu od 1 pro každý žánr.