sql >> Databáze >  >> RDS >> Sqlserver

Jak funguje ROW_NUMBER() na serveru SQL

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.

je požadováno. Určuje pořadí, ve kterém jsou řádkům přiřazeny jejich jedinečné ROW_NUMBER v určeném oddílu.

Všimněte si, že OVER klauzule normálně přijímá klauzuli , ale tento argument nelze s touto funkcí použít.

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 a AlbumId 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.


  1. mysql_fetch_assoc():zadaný argument není platným zdrojem výsledků MySQL v php

  2. Monitorování zabezpečení databáze pro MySQL a MariaDB

  3. Jak zálohovat jednu tabulku v databázi MySQL?

  4. MySQL 8.0 – klient nepodporuje ověřovací protokol požadovaný serverem; zvažte upgrade klienta MySQL