SQLShack (Čeština)

V tomto článku budeme diskutovat funkce SQL ROW_NUMBER. Toto je pokračování základní řady SQL. V této příručce vysvětlím, o čem je funkce okna, a uvidíte ukázkové příklady, které vám pomohou porozumět konceptům za funkcí SQL ROW_NUMBER.

Úvod

Nejvíce běžně používanou funkcí na serveru SQL Server je funkce SQL ROW_NUMBER. Funkce SQL ROW_NUMBER je k dispozici na serveru SQL Server 2005 a novějších verzích.

ROW_NUMBER přidává do tabulky výsledků jedinečné přírůstkové číslo. Pořadí, ve kterém jsou použita čísla řádků, je určeno výrazem ORDER BY. Většinu času je ve výrazu ORDER BY specifikován jeden nebo více sloupců, ale je možné použít složitější výrazy nebo dokonce dílčí dotaz. Takže vytváří neustále se zvyšující integrální hodnotu a vždy začíná na 1 a následující řádky získají další vyšší hodnotu.

Můžete jej také použít s klauzulí PARTITION BY. Ale když překročí hranici nebo hranici oddílu, vynuluje čítač a začne od 1. Takže oddíl může mít hodnoty 1, 2, 3 atd. A druhé oddíly znovu spustí čítač z 1, 2, 3… a tak dále a tak dále.

Základy:

  1. Funkce SQL ROW_NUMBER je neperzistentní generování posloupnosti dočasných hodnot a vypočítává se dynamicky při provedení dotazu.
  2. Neexistuje žádná záruka, že řádky vrácené dotazem SQL pomocí funkce SQL ROW_NUMBER budou při každém provedení seřazeny přesně stejně.
  3. Funkce ROW_NUMBER a RANK jsou podobné. Výstupem ROW_NUMBER je posloupnost hodnot začínajících od 1 s přírůstkem 1, ale zatímco funkce RANK se hodnoty také zvyšují o 1, ale hodnoty se budou opakovat pro vazby.
  4. Pokud jste zkušenost s Oracle, pak je vám ROWNUM známější. Je to pseudosloup. Začíná to s 1 a jde úplně dolů, zvyšuje se o jednu, na konec tabulky.
  5. Funkce SQL ROW_NUMBER má dynamickou povahu a my můžeme hodnoty resetovat pomocí klauzule PARTITION BY
  6. Klauzule ORDER BY dotazu a klauzule ORDER BY OVER klauzule spolu nemají nic společného.

Syntaxe

1
2

ROW_NUMBER ()
OVER (] order_by_clause col1, col2 ..)

ROW_NUMBER

ROW_NUMBER následovaný funkcí OVER a poté v závorkách použijte klauzuli ORDER BY. Je nutné použít klauzuli ORDER BY, aby bylo možné uložit druh pořadí pro sadu výsledků.

OVER

Klauzule OVER definuje okno nebo sadu řádků, které okno funkce funguje, takže je opravdu důležité ji pochopit. Možné součásti klauzule OVER jsou ORDER BY a PARTITION BY.

Výraz ORDER BY klauzule OVER je podporován, pokud je nutné řádky určitým způsobem seřadit, aby funkce fungovala.

1
ROZDĚLENÍ PODLE value_expression1

PARTITION BY

Klauzule Partition By je volitelná. Při zadání hodnoty rozdělí sadu výsledků vytvořenou klauzulí FROM na oddíly, na které se použije funkce SQL ROW_NUMBER. Hodnoty uvedené v klauzuli PARTITION definují hranice sady výsledků. Pokud není zadána klauzule PARTITION BY, pak klauzule OVER funguje na všech řádcích sady výsledků jako jeden datový soubor. Tato klauzule může sestávat z jednoho nebo více sloupců, složitějšího výrazu nebo dokonce z dílčího dotazu.

order_by_clause

Klauzule Order by je povinná klauzule. Určuje posloupnost a přidružení dočasné hodnoty k řádkům zadaného oddílu. Klauzule ORDER BY je výrazem klauzule OVER a určuje, jak je nutné řádky určitým způsobem pro funkci zarovnat.

Demo

V této části Podívám se na funkci SQL ROW_NUMBER. Pro celou ukázku jsem použil databázi AdventureWorks2016.

Jak používat ROW_NUMBER v SQL Query

V následujících příkladech uvidíme použití klauzule OVER.

Pojďme získat seznam všech zákazníků promítnutím sloupců jako SalesOrderID, OrderDate, SalesOrderNumber, SubTotal, TotalDue a RowNum. Funkce Row_Number se použije v pořadí sloupce CustomerID.Dočasná hodnota začíná od 1 přiřazené na základě pořadí ID zákazníka a hodnoty pokračují až do posledních řádků tabulky. Pořadí ID zákazníka není zaručeno, protože v dotazu nezadáme klauzuli ORDER BY.

1
2
3
4
5
6
7
8
9
10
11

USE AdventureWorks2016;
GO
VYBERTE ROW_NUMBER () NAD (
OBJEDNÁVKU PODLE ID zákazníka) JAKO RowNum,
ID zákazníka,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader;

Jak používat klauzuli Řadit podle

Následující příklad používá v dotazu klauzuli ORDER BY. Klauzule ORDER BY v dotazu použitém ve sloupci SalesOrderID. Vidíme, že řádky ve výstupu jsou stále seřazené a vrácené. Číslo_řádku se stále použije na ID zákazníka. Výstup označuje, že ORDER BY dotazu a ORDER BY klauzule OVER jsou nezávislé na výstupu.

1
2
3
4
5
6
7
8
9
10
11
12

POUŽITÍ AdventureWorks2016;
GO
VYBERTE ROW_NUMBER () NAD (
OBJEDNÁVKU PODLE ID zákazníka) JAKO RowNum,
ID zákazníka,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader
OBJEDNAT PODLE SalesOrderID;

Jak používat více sloupců s klauzulí OVER

Následující příklad ukazuje, že v klauzuli ORDER BY jsme uvedli customerID a OrderDate. Získáte tak podrobnosti o zákazníkovi s nejnovějšími podrobnostmi objednávky a posloupností čísel přiřazených celé sadě výsledků.

1
2
3
4
5
6
7
8
9
10

POUŽITÍ AdventureWorks2016;
GO
VYBERTE ROW_NUMBER () NAD (OBJEDNÁVKU PODLE IDZákazníka, datumObjednávky DESC) JAKO RowNum,
IDZákazníka,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader

Jak používat funkci SQL ROW_NUMBER s PARTITION

Následující příklad používá klauzuli PARTITION BY v polích CustomerID a OrderDate. Ve výstupu vidíte, že zákazník 11019 má tři objednávky na měsíc 2014 – červen. V tomto případě se oddíl provádí na více než jednom sloupci.

Oddíl je kombinací OrderDate a CustomerID. Row_Number začne znovu pro každou jedinečnou kombinaci OrderDate a CustomerID. Tímto způsobem je snadné najít zákazníka, který zadal více než jednu objednávku ve stejný den.

1
2
3
4
5
6
7
8
9
10
11
12

POUŽITÍ AdventureWorks2016;
GO
VYBERTE ROW_NUMBER () NAD (ROZDĚLENÍ ID zákazníka,
DATEADD (MĚSÍC, DATEDIFF (MĚSÍC, 0, DatumObjednávky), 0)
ORDER BY SubTotal DESC) AS MonthlyOrders,
CustomerID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader;

Jak vrátit podmnožinu řádků pomocí CTE a ROW_NUMBER

V následujícím příkladu analyzujeme SalesOrderHeader, abychom zobrazili pět nejlepších největších objednávek zadaných každým zákazníkem Měsíc. Pomocí funkce Měsíc jsou sloupce orderDate manipulovány, aby načetly část měsíce.Tímto způsobem jsou rozděleny tržby odpovídající konkrétnímu měsíci (OrderDate) spolu se zákazníkem (CustomerID).

K uvedení pěti největších objednávek v každém měsíci pro každého zákazníka se používá CTE. Na datech oddílu je vytvořeno okno, které je přiřazeno hodnotám a poté je voláno CTE k načtení největších objednávek.

1
2
3
4
5
6
7
8
9
10
11
12

S cte
AS (VYBERTE ČÍSLO ROW_NUMBER NAD (ROZDĚLENÍ PODLE ID zákazníka, MĚSÍC (Datum objednávky) OBJEDNAT PODLE Mezisoučtu DESC, TotalDue DESC) JAKO ROW_NUM,
CustomerID,
MONTH (OrderDate) měsíc,
mezisoučet,
TotalDue,
OrderDate
FROM Sales.SalesOrderHeader
)
SELECT *
FROM cte
KDE ROW_NUM < = 5

Shrnutí

Zatím jsme podrobně zkontrolovali funkci SQL ROW_NUMBER. Diskutovali jsme o několika příkladech od jednoduchých po složité. Také jsme diskutovali o tom, jak používat funkci SQL ROW_NUMBER s CTE (Common Table Expressions). Ve většině případů se u každé funkce okna vždy zobrazí klauzule over.

Klauzule over definuje okno, které vidí každý řádek. V rámci klauzule over je oddíl podle, opět je podporován každou funkcí okna, následovaný klauzulí order by. To je zatím vše … Doufám, že se vám článek líbil.

  • Autor
  • Poslední příspěvky
Jsem databázový technolog, který má více než 11 let bohaté praktické zkušenosti s databázovými technologiemi. Jsem Microsoft Certified Professional a mám titul v oboru počítačových aplikací.
Moje specializace spočívá v navrhování & implementace řešení vysoké dostupnosti a migrace databáze napříč platformami. Aktuálně fungující technologie jsou SQL Server, PowerShell, Oracle a MongoDB.
Zobrazit všechny příspěvky od Prashanth Jayaram

Poslední příspěvky od Prashanth Jayaram (zobrazit všechny)
  • Stručný přehled auditu databáze v SQL – 28. ledna 2021
  • Jak nastavit Azure Data Sync mezi databázemi Azure SQL a místním SQL Serverem – 20. ledna 2021
  • Jak provádět operace importu a exportu databáze Azure SQL pomocí PowerShellu – 14. ledna , 2021

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *