SQLShack (Norsk)

I denne artikkelen skal vi diskutere SQL ROW_NUMBER-funksjonen. Dette er en fortsettelse av SQL essensielle serien. I denne guiden vil jeg forklare hva en vindusfunksjon handler om, og du vil se eksempler på eksempler for å forstå konseptene bak SQL ROW_NUMBER-funksjonen.

Innledning

Det mest ofte brukt funksjon i SQL Server er SQL ROW_NUMBER-funksjonen. SQL ROW_NUMBER-funksjonen er tilgjengelig fra SQL Server 2005 og nyere versjoner.

ROW_NUMBER legger til et unikt trinn for økning i resultatrutenettet. Rekkefølgen som radnumrene brukes i, bestemmes av ORDER BY-uttrykket. Det meste av tiden er en eller flere kolonner spesifisert i ORDER BY-uttrykket, men det er mulig å bruke mer komplekse uttrykk eller til og med en underspørring. Så det skaper en stadig økende integralverdi, og den starter alltid på 1, og påfølgende rader får neste høyere verdi.

Du kan også bruke den med en PARTITION BY-ledd. Men når den krysser en partisjonsgrense eller en grense, tilbakestiller den telleren og starter fra 1. Så, partisjonen kan ha verdier 1, 2, 3 og så videre, og de andre partisjonene starter telleren igjen fra 1, 2, 3 … og så videre.

Grunnleggende:

  1. SQL ROW_NUMBER-funksjonen er en ikke-vedvarende generasjon av en sekvens av midlertidige verdier, og den beregnes dynamisk når spørringen utføres.
  2. Det er ingen garanti for at radene som returneres av et SQL-spørsmål ved hjelp av SQL ROW_NUMBER-funksjonen, blir bestilt nøyaktig likt med hver utførelse.
  3. ROW_NUMBER- og RANK-funksjonene er like. Utdataene fra ROW_NUMBER er en sekvens av verdier starter fra 1 med en økning på 1, men mens RANK-funksjonen, økes også verdiene med 1, men verdiene gjentas for båndene.
  4. Hvis du har en opplevelse med Oracle så er ROWNUM mer kjent for deg. Det er en pseudokolonne. Det starter med 1 og går helt ned og øker med en, til slutten av tabellen.
  5. SQL ROW_NUMBER-funksjonen er dynamisk og vi har lov til å tilbakestille verdiene ved hjelp av PARTITION BY-setningen
  6. ORDER BY-leddet i spørringen og ORDER BY-leddet i OVER klausul har ingenting å gjøre med hverandre.

Syntaks

1
2

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

ROW_NUMBER

ROW_NUMBER etterfulgt av OVER-funksjon og bruk deretter en ORDER BY-paragraf i parentes. Det er nødvendig å bruke ORDER BY-leddet for å innføre en slags ordre for resultatsettet.

OVER

OVER-setningen definerer vinduet eller settet med rader som vinduet funksjonen fungerer, så det er veldig viktig for deg å forstå. De mulige komponentene i OVER-klausulen er ORDER BY og PARTITION BY.

ORDER BY-uttrykket til OVER-klausulen støttes når radene må stilles opp på en bestemt måte for at funksjonen skal fungere.

1
PARTITION BY value_expression1

PARTITION BY

Partition By-setningen er valgfri. Når du angir verdien, deler den resultatsettet produsert av FROM-setningen i partisjoner som SQL ROW_NUMBER-funksjonen brukes på. Verdiene spesifisert i PARTITION-leddet definerer grensene for resultatsettet. Hvis PARTITION BY-ledd ikke er spesifisert, fungerer OVER-setningen på alle radene i resultatsettet som et enkelt datasett. Denne paragrafen kan bestå av en eller flere kolonner, et mer komplekst uttrykk eller til og med en underspørring.

order_by_clause

The Order by paragraph er en obligatorisk paragraf. Den bestemmer sekvensen og tilknytningen av den midlertidige verdien til radene i en spesifisert partisjon. ORDER BY-setningen er et uttrykk for OVER-klausulen, og den bestemmer hvordan radene må stilles opp på en bestemt måte for funksjonen.

Demo

I denne delen, vi Se på funksjonen SQL ROW_NUMBER. For hele demonstrasjonen har jeg brukt AdventureWorks2016-databasen.

Hvordan bruke ROW_NUMBER i SQL-spørring

Følgende eksempler ser vi bruken av OVER-setningen.

La oss få listen over alle kundene ved å projisere kolonnene som SalesOrderID, OrderDate, SalesOrderNumber, SubTotal, TotalDue og RowNum. Row_Number-funksjonen brukes i rekkefølgen i CustomerID-kolonnen.Den midlertidige verdien starter fra 1 tildelt basert på rekkefølgen på kunde-ID, og verdiene fortsetter til de siste radene i tabellen. Bestillingen av CustomerID er ikke garantert fordi vi ikke spesifiserer ORDER BY-leddet i spørringen.

1
2
3
4
5
6
7
8
9
10
11

BRUK AdventureWorks2016;
GO
VELG RAD_NUMBER () OVER (
BESTILL AV Kunde-ID) SOM RowNum,
Kunde-ID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader;

Slik bruker du Order by clause

Følgende eksempel bruker ORDER BY-setningen i spørringen. ORDER BY-setningen i spørringen som brukes i SalesOrderID-kolonnen. Vi kan se at radene i utdata fortsatt er bestilt og returnert. Radnummeret brukes fortsatt på kunde-ID-en. Utgangen indikerer at ORDER BY for spørringen og ORDER BY for OVER-klausulen er uavhengig av utdataene.

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

BRUK AdventureWorks2016;
GO
VELG RAD_NUMBER () OVER (
BESTILL AV Kunde-ID) SOM RowNum,
Kunde-ID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader
BESTILLE AV SalesOrderID;

Slik bruker du flere kolonner med OVER-setningen

Følgende eksempel kan du se at vi har oppført customerID og OrderDate i ORDER BY-setningen. Dette gir kundedetaljer med de siste bestillingsdetaljene sammen med rekkefølgen av tall som er tildelt hele resultatsettet.

1
2
3
4
5
6
7
8
9
10

BRUK AdventureWorks2016;
GO
VELG RAD_NUMBER () OVER (BESTILL AV KundeID, OrderDate DESC) SOM RowNum,
Kunde-ID,
SalgsordreID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FRA Sales.SalesOrderHeader

Hvordan bruke SQL ROW_NUMBER-funksjonen med PARTITION

Følgende eksempel bruker PARTITION BY-ledd i CustomerID- og OrderDate-felt. I produksjonen kan du se at kunden 11019 har tre ordrer for måneden 2014-juni. I dette tilfellet er partisjonen gjort i mer enn en kolonne.

Partisjonen er en kombinasjon av OrderDate og CustomerID. Radnummeret starter på nytt for hver unike kombinasjon av OrderDate og CustomerID. På denne måten er det enkelt å finne kunden som har lagt inn mer enn én bestilling samme dag.

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

BRUK AdventureWorks2016;
GO
VELG RAD_NUMBER () OVER (PARTITION BY CustomerID,
DATEADD (MONTH, DATEDIFF (MONTH, 0, OrderDate), 0)
BESTILLE PÅ DOTTOTAL DESC) SOM Månedlige bestillinger,
Kunde-ID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
Delsum,
TotalDue
FRA Sales.SalesOrderHeader;

Hvordan returnere et delsett av rader ved hjelp av CTE og ROW_NUMBER

Følgende eksempel skal vi analysere SalesOrderHeader for å vise de fem største bestillingene som hver kunde plasserer hver måned. Ved hjelp av Måned-funksjonen manipuleres orderDate-kolonnene for å hente månedsdelen.På denne måten er salget som tilsvarer spesifikk måned (OrderDate) sammen med kunde (CustomerID) partisjonert.

For å liste opp de fem største ordrene i hver måned for hver kunde, brukes en CTE. Det opprettes et vindu på partisjonsdataene og de tildeles verdiene, og deretter blir CTE kalt for å hente de største ordrene.

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

MED cte
AS (VELG ROW_NUMBER OVER (PARTITION BY customerID, MONTH (OrderDate) ORDER BY SubTotal DESC, TotalDue DESC) AS ROW_NUM,
CustomerID,
MONTH (OrderDate) Month,
SubTotal,
TotalDue,
OrderDate
FRA Sales.SalesOrderHeader
)
SELECT *
FRA cte
WHERE ROW_NUM < = 5

Sammendrag

Så langt har vi gjennomgått SQL ROW_NUMBER-funksjonen i detalj. Vi har diskutert flere eksempler fra enkle til komplekse. Vi diskuterte også hvordan du bruker SQL ROW_NUMBER-funksjonen med CTE (Common Table Expressions). I de fleste tilfeller vil du alltid se en overklausul med hver vindusfunksjon.

Over-leddet definerer vinduet som hver rad ser. Innenfor over-setningen er det en partisjon av, igjen støttes den av hver vindusfunksjon, etterfulgt av rekkefølgen etter paragraf. Det er alt for nå … Håper du likte å lese artikkelen.

  • Forfatter
  • Nylige innlegg
Jeg er en databaseteknolog som har 11+ års rik, praktisk erfaring med databaseteknologier. Jeg er Microsoft-sertifisert profesjonell og støttet med en grad i Master of Computer Application.
Min spesialitet ligger i å designe & implementering av høy tilgjengelighetsløsninger og plattform-DB-migrering. Teknologiene som for tiden jobber med er SQL Server, PowerShell, Oracle og MongoDB.
Vis alle innlegg av Prashanth Jayaram

Siste innlegg av Prashanth Jayaram (se alle)
  • En rask oversikt over databasetilsyn i SQL – 28. januar 2021
  • Slik konfigurerer du Azure Data Sync mellom Azure SQL-databaser og lokale SQL Server – 20. januar 2021
  • Slik utfører du Azure SQL-database Import / Export-operasjoner ved bruk av PowerShell – 14. januar , 2021

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *