Problém:
Každému řádku ve výsledkové tabulce byste rádi přidělili samostatné číslo.
Příklad:
Naše databáze obsahuje tabulku s názvem furniture
s údaji v následujících sloupcích:code
(primární klíč) a name
.
kód | jméno |
---|---|
101 | postel |
202 | pohovka |
333 | židle |
123 | knihovna |
235 | tabulka |
766 | stůl |
furniture
tabulka ukládá názvy kusů nábytku, které chceme očíslovat.
Řešení:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Dotaz vrátí číslo řádku každého kusu nábytku spolu s jeho názvem a kódem:
num_row | jméno | kód |
---|---|---|
1 | postel | 101 |
2 | pohovka | 202 |
3 | židle | 333 |
4 | knihovna | 123 |
5 | tabulka | 235 |
6 | stůl | 766 |
Všimněte si, že názvy kusů nábytku nejsou seřazeny.
Diskuse:
Pokud chcete očíslovat každý řádek v sadě výsledků, SQL poskytuje ROW_NUMBER()
funkce. Tato funkce se používá v SELECT
doložka s jinými sloupci. Za ROW_NUMBER()
klauzuli, nazýváme OVER()
funkce. Pokud předáte nějaké argumenty do OVER
, číslování řádků nebude řazeno podle žádného sloupce. Pořadí zobrazených řádků tedy bude nedeterministické; ve většině případů jde o pořadí, ve kterém byly záznamy do tabulky vloženy. Číslování řádků začíná na 1. V našem příkladu má každý záznam číslo od 1 do 6.
Čísla řádků můžeme přiřadit také pomocí sloupce. V níže uvedeném příkladu očíslujeme záznamy seřazené podle názvu. To provedeme předáním tohoto argumentu do OVER
spolu s ORDER BY
(třídí záznamy podle sloupce názvu):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Když se podíváte na sadu výsledků, uvidíte seřazené řádky s jejich čísly:
řádek | jméno | kód |
---|---|---|
1 | postel | 101 |
2 | knihovna | 123 |
3 | židle | 333 |
4 | stůl | 766 |
5 | pohovka | 202 |
6 | tabulka | 235 |
Číslování poskytnuté pomocí ROW_NUMBER()
je nezávislé na pořadí řádků ve výsledkové tabulce. V níže uvedeném příkladu číslujeme záznamy pomocí názvu seřazeného sloupce (OVER(ORDER BY name)
), ale záznamy ve výsledkové sadě zobrazujeme podle jiného sloupce (v našem příkladu ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Dotaz vrátil číslo na každém řádku, ale tato čísla nejsou ve vzestupném pořadí, protože záznamy jsou seřazeny podle kódu sloupce:
řádek | jméno | kód |
---|---|---|
1 | postel | 101 |
2 | knihovna | 123 |
5 | pohovka | 202 |
6 | tabulka | 235 |
3 | židle | 333 |
4 | stůl | 766 |
Výchozí pořadí seřazených řádků je vzestupné, ale můžete je také seřadit v sestupném pořadí pomocí DESC
klíčové slovo za názvem sloupce, podle kterého chcete třídit:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Výše uvedený dotaz vrátil sadu výsledků:
řádek | jméno | kód |
---|---|---|
4 | stůl | 766 |
3 | židle | 333 |
6 | tabulka | 235 |
5 | pohovka | 202 |
2 | knihovna | 123 |
1 | postel | 101 |