sql >> Databáze >  >> RDS >> Database

Jak číslovat řádky v SQL

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

  1. Proč SQL server hází tuto chybu:Nelze vložit hodnotu NULL do sloupce 'id'?

  2. Příprava serveru MySQL nebo MariaDB pro produkci – část první

  3. MySQL COALESCE a funkce NULLIF

  4. Přepnutí databáze a převzetí služeb při selhání pro weby Drupal využívající MySQL nebo PostgreSQL