SQLShack (Dansk)

I denne artikel skal vi diskutere SQL ROW_NUMBER-funktionen. Dette er en fortsættelse af SQL essentiel serie. I denne vejledning forklarer jeg, hvad en vinduesfunktion handler om, og du vil se eksempler på eksempler for at forstå begreberne bag SQL ROW_NUMBER-funktionen.

Introduktion

Det mest almindelig anvendt funktion i SQL Server er SQL ROW_NUMBER-funktionen. SQL ROW_NUMBER-funktionen er tilgængelig fra SQL Server 2005 og nyere versioner.

ROW_NUMBER tilføjer et unikt stigende nummer til resultatgitteret. Rækkefølgen, som rækkenumrene anvendes i, bestemmes af udtrykket ORDER BY. Det meste af tiden er en eller flere kolonner specificeret i ORDER BY-udtrykket, men det er muligt at bruge mere komplekse udtryk eller endda en underforespørgsel. Så det skaber en stadigt stigende integralværdi, og det starter altid ved 1, og efterfølgende rækker får den næste højere værdi.

Du kan også bruge den med en PARTITION BY-klausul. Men når den krydser en partitionsgrænse eller -grænse, nulstiller den tælleren og starter fra 1. Så partitionen kan have værdier 1, 2, 3 osv. Og de anden partitioner starter tælleren igen fra 1, 2, 3 … og så videre og så videre.

Grundlæggende:

  1. Funktionen SQL ROW_NUMBER er en ikke-vedvarende generation af en sekvens af midlertidige værdier, og den beregnes dynamisk, når forespørgslen udføres.
  2. Der er ingen garanti for, at de rækker, der returneres af en SQL-forespørgsel ved hjælp af SQL ROW_NUMBER-funktionen, vil blive bestilt nøjagtigt ens med hver udførelse.
  3. ROW_NUMBER- og RANK-funktionerne er ens. Outputtet fra ROW_NUMBER er en række værdier starter fra 1 med en forøgelse på 1, mens RANK-funktionen øges, men værdierne øges også med 1, men værdierne gentages for båndene.
  4. Hvis du har en oplevelse med Oracle, så ROWNUM er mere kendt for dig. Det er en pseudokolonne. Det starter med 1 og går helt ned og øges med en til slutningen af bordet.
  5. Funktionen SQL ROW_NUMBER er dynamisk, og vi har lov til at nulstille værdierne ved hjælp af PARTITION BY-klausulen
  6. ORDER BY-klausulen i forespørgslen og ORDER BY-klausulen i OVER klausul har intet at gøre med hinanden.

Syntaks

1
2

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

ROW_NUMBER

ROW_NUMBER efterfulgt af OVER-funktion og brug derefter en ORDER BY-klausul i parentes. Det er nødvendigt at bruge ORDER BY-klausulen for at pålægge en rækkefølge for resultatsættet.

OVER

OVER-klausulen definerer det vindue eller sæt af rækker, som vinduet funktion fungerer, så det er virkelig vigtigt for dig at forstå. De mulige komponenter i OVER-klausulen er ORDER BY og PARTITION BY.

ORDER BY-udtrykket i OVER-klausulen understøttes, når rækkerne skal stilles op på en bestemt måde for at funktionen kan fungere.

1
PARTITION BY value_expression1

PARTITION BY

Partition By-klausulen er valgfri. Ved angivelse af værdien opdeler det resultatsættet produceret af FROM-klausulen i partitioner, som SQL ROW_NUMBER-funktionen anvendes til. De værdier, der er specificeret i PARTITION-klausulen, definerer grænserne for resultatsættet. Hvis PARTITION BY-klausul ikke er specificeret, fungerer OVER-klausulen på alle rækkerne i resultatsættet som et enkelt datasæt. Denne klausul kan bestå af en eller flere kolonner, et mere komplekst udtryk eller endda en underforespørgsel.

order_by_clause

The Order by clause er en obligatorisk klausul. Det bestemmer rækkefølgen og tilknytningen af den midlertidige værdi til rækkerne i en bestemt partition. ORDER BY-klausulen er et udtryk for OVER-klausulen, og den bestemmer, hvordan rækkerne skal stilles op på en bestemt måde for funktionen.

Demo

I dette afsnit, vi Se på funktionen SQL ROW_NUMBER. I hele demoen har jeg brugt AdventureWorks2016-databasen.

Sådan bruges ROW_NUMBER i SQL-forespørgsel

De følgende eksempler ser vi brugen af OVER-klausul.

Lad os hente listen over alle kunder ved at projicere kolonnerne som SalesOrderID, OrderDate, SalesOrderNumber, SubTotal, TotalDue og RowNum. Funktionen Row_Number anvendes med rækkefølgen i kolonnen CustomerID.Den midlertidige værdi starter fra 1 tildelt baseret på rækkefølgen på kunde-idet, og værdierne fortsættes indtil de sidste rækker i tabellen. Rækkefølgen af CustomerID er ikke garanteret, fordi vi ikke specificerer ORDER BY-klausulen i forespørgslen.

1
2
3
4
5
6
7
8
9
10
11

BRUG AdventureWorks2016;
GO
VÆLG RAD_NUMBER () OVER (
BESTIL EFTER KundeID) SOM RowNum,
KundeID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader;

Sådan bruges Order by clause

Følgende eksempel bruger ORDER BY-klausulen i forespørgslen. ORDER BY-klausulen i forespørgslen anvendt i kolonnen SalesOrderID. Vi kan se, at rækkerne i output stadig er ordnet og returneret. Row_Number anvendes stadig på kunde-idet. Outputtet indikerer, at ORDER BY for forespørgslen og ORDER BY for OVER-klausulen er uafhængige af output.

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

BRUG AdventureWorks2016;
GO
VÆLG RAD_NUMBER () OVER (
BESTIL EFTER Kunde-ID) SOM RowNum,
Kunde-ID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader
ORDER BY SalesOrderID;

Sådan bruges flere kolonner med OVER-klausulen

Følgende eksempel kan du se, at vi har angivet kunde-ID og OrderDate i ORDER BY-klausulen. Dette giver kundeoplysninger med de seneste ordredetaljer sammen med rækkefølgen af numre, der er tildelt hele resultatsættet.

1
2
3
4
5
6
7
8
9
10

BRUG AdventureWorks2016;
GO
SELECT ROW_NUMBER () OVER (ORDER BY CustomerID, OrderDate DESC) AS RowNum,
CustomerID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader

Sådan bruges SQL ROW_NUMBER-funktionen med PARTITION

Følgende eksempel bruger PARTITION BY-klausul i felterne CustomerID og OrderDate. I output kan du se, at kunden 11019 har tre ordrer for måneden 2014-juni. I dette tilfælde udføres partitionen i mere end en kolonne.

Partitionen er en kombination af OrderDate og CustomerID. Række nummeret starter forfra for hver unik kombination af OrderDate og CustomerID. På denne måde er det let at finde den kunde, der har afgivet mere end en ordre samme dag.

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

BRUG AdventureWorks2016;
GO
VÆLG ROW_NUMBER () OVER (DELING EFTER KundeID,
DATEADD (MONTH, DATEDIFF (MONTH, 0, OrderDate), 0)
BESTIL EFTER SubTotal DESC) SOM Månedlige ordrer,
CustomerID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader;

Sådan returneres et undersæt af rækker ved hjælp af CTE og ROW_NUMBER

Følgende eksempel analyserer vi SalesOrderHeader for at vise de fem største ordrer, der placeres af hver kunde hver måned. Ved hjælp af månedsfunktionen manipuleres orderDate-kolonnerne til at hente månedsdelen.På denne måde fordeles salget svarende til den specifikke måned (OrderDate) sammen med kunde (CustomerID).

For at liste de fem største ordrer i hver måned for hver kunde bruges en CTE. Der oprettes et vindue på partitionsdataene, og de tildeles værdierne, og derefter kaldes CTE til at hente de største ordrer.

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

MED cte
AS (VÆLG ROW_NUMBER OVER (DELING EFTER kundeID, MÅNED (OrderDate) BESTIL EFTER SubTotal DESC, TotalDue DESC) SOM ROW_NUM,
CustomerID,
MONTH (OrderDate) Month,
SubTotal,
TotalDue,
OrderDate
FRA Sales.SalesOrderHeader
)
SELECT *
FRA cte
WHERE ROW_NUM < = 5

Oversigt

Indtil videre har vi gennemgået SQL ROW_NUMBER-funktionen detaljeret. Vi har diskuteret flere eksempler fra enkle til komplekse. Vi diskuterede også, hvordan man bruger SQL ROW_NUMBER-funktionen med CTEer (Common Table Expressions). I de fleste tilfælde vil du altid se en overklausul med hver vinduesfunktion.

Over-klausulen definerer det vindue, som hver række ser. Inden for over-klausulen er der en partition af, igen understøttes den af hver vinduesfunktion efterfulgt af rækkefølgen efter klausul. Det er alt for nu … Håber du nød at læse artiklen.

  • Forfatter
  • Seneste indlæg
Jeg er en databasetekniker med mere end 11 års rig, praktisk erfaring med databaseteknologier. Jeg er Microsoft-certificeret professionel og bakket op med en kandidatgrad i Master of Computer Application.
Min specialitet ligger i at designe & implementering af høj tilgængelighedsløsninger og DB-migrering på tværs af platforme. De teknologier, der i øjeblikket arbejder på, er SQL Server, PowerShell, Oracle og MongoDB.
Vis alle indlæg af Prashanth Jayaram

Seneste indlæg af Prashanth Jayaram (se alle)
  • En hurtig oversigt over databaseovervågning i SQL – 28. januar 2021
  • Sådan opsættes Azure Data Sync mellem Azure SQL-databaser og lokal SQL Server – 20. januar 2021
  • Sådan udføres Azure SQL-database Import / Export-operationer ved hjælp af PowerShell – 14. januar , 2021

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *