SQLShack (Svenska)

I den här artikeln ska vi diskutera SQL ROW_NUMBER-funktionen. Detta är en fortsättning på SQL-väsentliga serien. I den här guiden förklarar jag vad en fönsterfunktion handlar om och du ser exempel på exempel för att förstå begreppen bakom SQL ROW_NUMBER-funktionen.

Inledning

Det mest vanligt förekommande funktion i SQL Server är SQL ROW_NUMBER-funktionen. SQL ROW_NUMBER-funktionen är tillgänglig från SQL Server 2005 och senare versioner.

ROW_NUMBER lägger till ett unikt inkrementeringsnummer till resultatnätet. Ordningen, i vilken radnumren tillämpas, bestäms av uttrycket ORDER BY. För det mesta anges en eller flera kolumner i ORDER BY-uttrycket, men det är möjligt att använda mer komplexa uttryck eller till och med en underfråga. Så det skapar ett ständigt ökande integralt värde och det börjar alltid vid 1 och efterföljande rader får nästa högre värde.

Du kan också använda den med en PARTITION BY-sats. Men när den passerar en partitionsgräns eller -gräns, återställer den räknaren och börjar från 1. Så, partitionen kan ha värden 1, 2, 3 och så vidare och de andra partitionerna startar räknaren igen från 1, 2, 3 … och så vidare.

Grunder:

  1. SQL ROW_NUMBER-funktionen är en icke-bestående generation av en sekvens av tillfälliga värden och den beräknas dynamiskt när frågan körs.
  2. Det finns ingen garanti för att raderna som returneras av en SQL-fråga med SQL ROW_NUMBER-funktionen kommer att beställas exakt samma för varje körning.
  3. ROW_NUMBER- och RANK-funktionerna liknar varandra. Utsignalen från ROW_NUMBER är en sekvens av värden som börjar från 1 med ett steg på 1 men medan RANK-funktionen ökas också med 1 men värdena upprepas för bandet.
  4. Om du har en upplevelse med Oracle då är ROWNUM mer bekant för dig. Det är en pseudokolonn. Det börjar med 1 och går hela vägen och ökar med en, till slutet av bordet.
  5. SQL ROW_NUMBER-funktionen är dynamisk och vi får återställa värdena med hjälp av PARTITION BY-satsen
  6. ORDER BY-satsen i frågan och ORDER BY-satsen i OVER klausul har inget att göra med varandra.

Syntax

1
2

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

ROW_NUMBER

ROW_NUMBER följt av OVER-funktionen och använd sedan en ORDER BY-sats inom parentes. Det är nödvändigt att använda ORDER BY-satsen för att införa en sorteringsordning för resultatuppsättningen.

OVER

OVER-satsen definierar fönstret eller uppsättningen rader som fönstret funktionen fungerar, så det är väldigt viktigt för dig att förstå. De möjliga komponenterna i OVER-klausulen är ORDER BY och PARTITION BY.

ORDER BY-uttrycket i OVER-klausulen stöds när raderna måste ställas upp på ett visst sätt för att funktionen ska fungera.

1
PARTITION BY value_expression1

PARTITION BY

Partition By-satsen är valfri. När du anger värdet delar den resultatuppsättningen som produceras av FROM-satsen i partitioner som SQL ROW_NUMBER-funktionen tillämpas på. Värdena som anges i PARTITION-klausulen definierar resultatuppsättningens gränser. Om PARTITION BY-satsen inte anges, fungerar OVER-satsen på alla rader i resultatuppsättningen som en enda uppsättning. Denna sats kan bestå av en eller flera kolumner, ett mer komplext uttryck eller till och med en underfråga.

order_by_clause

The Order by clause är en obligatorisk sats. Det bestämmer sekvensen och associeringen av det tillfälliga värdet till raderna i en viss partition. ORDER BY-klausulen är ett uttryck för OVER-klausulen och den avgör hur raderna måste ställas in på ett visst sätt för funktionen.

Demo

I detta avsnitt, vi Titta på funktionen SQL ROW_NUMBER. Under hela demonstrationen har jag använt AdventureWorks2016-databasen.

Hur man använder ROW_NUMBER i SQL Query

Följande exempel ser vi användningen av OVER-klausulen.

Låt oss få en lista över alla kunder genom att projicera kolumnerna som SalesOrderID, OrderDate, SalesOrderNumber, SubTotal, TotalDue och RowNum. Funktionen Row_Number tillämpas med ordern i kolumnen CustomerID.Det tillfälliga värdet börjar från 1 tilldelat baserat på ordern på kund-ID och värdena fortsätter till de sista raderna i tabellen. Beställningen av CustomerID garanteras inte eftersom vi inte specificerar ORDER BY-satsen i frågan.

1
2
3
4
5
6
7
8
9
10
11

ANVÄND AdventureWorks2016;
GO
VÄLJ RADNUMBER () ÖVER (
BESTÄLLNING AV KundID) SOM RowNum,
KundID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader;

Så här använder du Order by clause

I följande exempel används ORDER BY-satsen i frågan. ORDER BY-klausulen i frågan tillämpas på kolumnen SalesOrderID. Vi kan se att raderna i utdata fortfarande är ordnade och returneras. Row_Number tillämpas fortfarande på CustomerID. Utdata indikerar att ORDER BY för frågan och ORDER BY för OVER-klausulen är oberoende av utdata.

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

ANVÄND AdventureWorks2016;
GO
VÄLJ RADNUMBER () ÖVER (
BESTÄLLNING AV KundID) SOM RowNum,
KundID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader
BESTÄLLNING AV SalesOrderID;

Så här använder du flera kolumner med OVER-satsen

Följande exempel kan du se att vi har listat kund-ID och OrderDate i ORDER BY-satsen. Detta ger kundinformation med de senaste beställningsuppgifterna tillsammans med sekvensen av nummer som tilldelats hela resultatuppsättningen.

1
2
3
4
5
6
7
8
9
10

ANVÄND AdventureWorks2016;
GO
VÄLJ RADNUMBER () ÖVER (BESTÄLLNING AV KundID, OrderDate DESC) SOM RowNum,
KundID,
SalesOrderID,
OrderDate,
SalesOrderNumber,
SubTotal,
TotalDue
FROM Sales.SalesOrderHeader

Hur man använder SQL ROW_NUMBER-funktionen med PARTITION

Följande exempel använder PARTITION BY-sats i CustomerID- och OrderDate-fälten. I produktionen kan du se att kunden 11019 har tre beställningar för månaden 2014-juni. I det här fallet görs partitionen i mer än en kolumn.

Partitionen är en kombination av OrderDate och CustomerID. Row_Number kommer att börja om för varje unik kombination av OrderDate och CustomerID. På det här sättet är det lätt att hitta den kund som har gjort mer än en beställning samma dag.

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

ANVÄND AdventureWorks2016;
GO
VÄLJ RADNUMBER () ÖVER (DELNING AV KundID,
DATUMADD (MÅNAD, DATERAD (MÅNAD, 0, OrderDate), 0)
BESTÄLLNING AV DOTTOTAL DESC) SOM Månadsbeställningar,
Kund-ID,
SalesOrderID,
OrderDate,
SalesOrderNumber, div>

Delsumma,
TotalDue
FRÅN Sales.SalesOrderHeader;

Hur man returnerar en delmängd av rader med CTE och ROW_NUMBER

Följande exempel kommer vi att analysera SalesOrderHeader för att visa de fem största beställningarna som placeras av varje kund varje månad. Med funktionen Månad manipuleras orderDate-kolumnerna för att hämta månadsdelen.På detta sätt delas försäljningen som motsvarar specifik månad (OrderDate) tillsammans med kund (CustomerID).

För att lista de fem största beställningarna i varje månad för varje kund används en CTE. Ett fönster skapas på partitionsdata och det tilldelas värdena och sedan kallas CTE för att hämta de största orderna.

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

MED cte
SOM (VÄLJ ROW_NUMBER OVER (PARTITION BY customerID, MONTH (OrderDate) ORDER BY SubTotal DESC, TotalDue DESC) AS ROW_NUM,
CustomerID,
MONTH (OrderDate) Month,
SubTotal,
TotalDue,
OrderDate
FRÅN Sales.SalesOrderHeader
)
VÄLJ *
FRÅN cte
WHERE ROW_NUM < = 5

Sammanfattning

Hittills har vi granskat SQL ROW_NUMBER-funktionen i detalj. Vi har diskuterat flera exempel från enkla till komplexa. Vi diskuterade också hur man använder SQL ROW_NUMBER-funktionen med CTE: er (Common Table Expressions). I de flesta fall ser du alltid en överklausul för varje fönsterfunktion.

Over-satsen definierar fönstret som varje rad ser. Inom överklausulen finns en partition av, igen stöds den av varje fönsterfunktion, följt av ordningen efter klausul. Det är allt för nu … Hoppas att du tyckte om att läsa artikeln.

  • Författare
  • Senaste inlägg
Jag är en databastekniker som har 11+ års rik, praktisk erfarenhet av databastekniker. Jag är Microsoft-certifierad professionell och har en examen i magisterexamen i datorprogram.
Min specialitet ligger i att designa & implementera hög tillgänglighetslösningar och plattformsmigrering över flera plattformar. De tekniker som för närvarande arbetar med är SQL Server, PowerShell, Oracle och MongoDB.
Visa alla inlägg av Prashanth Jayaram

Senaste inlägg av Prashanth Jayaram (se alla)
  • En snabb översikt över databasgranskning i SQL – 28 januari 2021
  • Så här ställer du in Azure Data Sync mellan Azure SQL-databaser och lokal SQL Server – 20 januari 2021
  • Hur man utför Azure SQL-databasimport / exportåtgärder med PowerShell – 14 januari 2021

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *