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
AlbumNamemí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_NUMBERaAlbumIdsloupce jsou zcela nekorelované.V tomto případě rozděluji podle
Genresloupec. To způsobí, že číslování začne znovu od 1 pro každý žánr.