SQLs mångsidighet som DBMS-frågespråk har ökat under åren. Dess expansiva användbarhet och mångsidighet gör den till en favorit bland alla dataanalytiker.
Det finns en hel del funktioner på avancerad nivå förutom SQLs vanliga. Dessa funktioner är allmänt kända som fönsterfunktioner. Om du har att göra med komplexa data och vill utföra avancerade beräkningar kan du använda dem för att utnyttja din data på bästa sätt.
Vikten av fönsterfunktioner
Flera fönsterfunktioner finns tillgängliga i SQL, och var och en hjälper dig att utföra en rad beräkningar. Från att skapa partitioner till att rangordna rader eller tilldela radnummer, dessa fönsterfunktioner gör lite av allt.
Fönsterfunktioner är fördelaktiga när du tillämpar aggregerade funktioner över en specifik datamängd eller samling av rader. Dessa funktioner går utöver de aggregeringsfunktioner som GROUP BY tillhandahåller. Den största skillnaden är dock att, till skillnad från grupperingsfunktionen, dina data inte kombineras till en enda rad.
Du kan inte använda fönsterfunktioner inom VAR, FRÅN, och GRUPP AV uttalanden.
Syntax för en fönsterfunktion
När du hänvisar till någon fönsterfunktion måste du följa standardsyntaxstrukturen så att den fungerar korrekt. Om du strukturerar kommandot felaktigt får du ett felmeddelande och din kod kommer inte att köras.
Här är standardsyntaxen:
VÄLJ kolumnnamn1,
{window_function}(kolumnnamn2)
ÖVER([PARTITION BY kolumnnamn1] [ORDER BY kolumnnamn3]) SOM ny_kolumn
FRÅN tabellnamn;
Var:
- kolumnnamn1 är det första kolumnnamnet du vill välja.
- {window_function} är namnet på en aggregerad funktion som summa, avg, count, row_number, rank eller tät_rank.
- kolumnnamn2 är namnet på kolumnen där du använder fönsterfunktionen.
- kolumnnamn3 är det tredje kolumnnamnet, som kommer att utgöra basen för partitionen.
- ny_kolumn är en etikett för den nya kolumnen som du kan använda med hjälp av SOM nyckelord.
- tabellnamn är namnet på källtabellen.
Fönsterfunktioner skiljer sig från vissa av de de flesta grundläggande SQL-kommandon. Till skillnad från aggregerade funktioner i SQL kan du använda dessa fönsterfunktioner för att utföra avancerade funktioner.
Förbereder datamängden
Du kan använda SKAPA BORD uttalande till skapa en ny tabell i SQL. Här är ett exempel på dataset som den här guiden kommer att använda för att definiera vissa fönsterfunktioner:
Orderdatum |
Kategori |
Färg |
Försäljningspris |
Kvantitet |
---|---|---|---|---|
08-11-2016 |
Telefoner |
Svart |
907.152 |
6 |
12-06-2016 |
Pärmar |
Grön |
18.504 |
3 |
11-10-2015 |
Vitvaror |
Gul |
114.9 |
5 |
11-10-2015 |
Tabeller |
Brun |
1706.184 |
9 |
09-06-2014 |
Telefoner |
Röd |
911.424 |
4 |
09-06-2014 |
Papper |
Vit |
15.552 |
3 |
09-06-2014 |
Pärmar |
Svart |
407.976 |
3 |
09-06-2014 |
Vitvaror |
Gul |
68.81 |
5 |
09-06-2014 |
Pärmar |
Grön |
2.544 |
3 |
09-06-2014 |
Lagring |
Orange |
665.88 |
6 |
09-06-2014 |
Lagring |
Orange |
55.5 |
2 |
15-04-2017 |
Telefoner |
Svart |
213.48 |
3 |
05-12-2016 |
Pärmar |
Grön |
22.72 |
4 |
22-11-2015 |
Vitvaror |
Grön |
60.34 |
7 |
22-11-2015 |
Stolar |
Mörkbrun |
71.372 |
2 |
13-05-2014 |
möbel |
Orange |
190.92 |
5 |
Summafunktionen förklaras
Anta att du vill beräkna den totala försäljningen för varje värde inom kategorikolumnen. Så här kan du göra det:
VÄLJkategori, Färg,
summa (försäljningspris)
ÖVER (order efter kategori) AS total_sales
FRÅN sahil.sample;
I ovanstående kod hämtar SQL-satsen kategorin och färgen från den ursprungliga datamängden. Summafunktionen summerar kolumnen sale_price. Den gör det efter kategori, eftersom OVER-satsen anger ordning efter kategorikolumnen. Slutresultatet är som följer:
Hur man använder Avg() fönsterfunktionen
Precis som summafunktionen kan du beräkna genomsnittet per rad med data med snitt fungera. Istället för summan får du en kolumn med den genomsnittliga försäljningen.
VÄLJkategori, Färg,
medelvärde (försäljningspris)
ÖVER (order efter kategori) AS avg_sales
FRÅN sahil.sample;
Lär dig att använda Count() Window-funktionen
I likhet med funktionerna summa och avg är räknefönsterfunktionen i SQL ganska enkel och fungerar på samma sätt som de andra två funktionerna. När du klarar räknefunktionen får du det totala antalet för varje värde i den nya kolumnen.
Så här kan du beräkna antalet:
VÄLJkategori, Färg,
räkna (kategori)
ÖVER (order efter kategori) AS item_count
FRÅN sahil.sample;
Fönsterfunktionen Row_Number()
Till skillnad från några av de andra fönsterfunktionerna ovan, fungerar row_number() något annorlunda. Funktionen row_number() tilldelar ett radnummer till varje rad, beroende på ordna efter sats. Startradens nummer är 1; radnummer tilldelar ett motsvarande värde till varje rad till slutet.
Här är den grundläggande strukturen för en row_number()-funktion:
VÄLJkategori, Färg,
rad_nummer()
OVER (order efter kategori) AS artikelnummer
FRÅN sahil.sample;
Men vad händer om du vill tilldela separata radnummer till varje kategoriobjekt? Ovanstående syntax anger ett rullande serienummer, oavsett vilka objekt som lagras inom kategorin. Till exempel bör apparatens kategori ha sin exklusiva numrering, följt av pärmar och så vidare.
Du kan använda dela funktion för att utföra denna enkla men praktiska uppgift. Nyckelordet partition tilldelar angivna radnummer baserat på varje kategoriobjekt.
VÄLJkategori, Färg,
rad_nummer()
OVER (partition efter kategori ordning efter kategori) AS item_number
FRÅN sahil.sample;
Funktionerna Rank() och Dense_Rank()
De rang() funktionen fungerar annorlunda än rad_nummer() fungera. Du måste ange kolumnnamnet i ordningen efter funktion, för att använda det som bas för att definiera rangvärdena. Till exempel, i följande kodexempel kan du använda färgkolumnen inom ordning efter funktion. Frågan kommer sedan att använda den ordningen för att tilldela ett rangvärde till varje rad.
Du kan använda kodsyntaxen nedan för att skicka en rangfunktion i SQL:
VÄLJkategori, Färg,
rang()
ÖVER (ordning efter färg) AS item_rank
FRÅN sahil.sample;
Ta en titt på utgången för att förstå hur den här funktionen fungerar.
Ordning efter funktion sorterar färgkategorin, medan rankningsfunktionen tilldelar varje färg en rangordning. Alla samma färgvärden har dock samma rangordning, medan de olika färgerna har separata rangordningar. Färgen svart förekommer tre gånger i datasetet; istället för att tilldela ett rangvärde på 1, 2 och 3, får de svarta färgobjekten en rang på 1.
Nästa färg Brown får dock en rank 4 istället för rank 2. Rangeringsfunktionen hoppar över värden och tilldelar nästa kronologiska värde till de olika posterna. Om du vill tilldela ett mer meningsfullt rangvärde kan du använda tät_rank() fungera.
Funktionen dense_rank hoppar inte över några rangvärden under ordningen efter funktion. Till exempel kommer de tre första färgartiklarna (svart) att ha rang 1. Följande färg (Brun) kommer dock inte att ha rang 4, utan rang 2, vilket är följande kronologiska nummer i numreringslistan. Funktionen dense_rank är en mer praktisk fönsterfunktion eftersom den tilldelar ett meningsfullt värde till listan med objekt.
Så här kan du använda dense_rank-funktionen i SQL:
VÄLJkategori, Färg,
tät_rank()
ÖVER (ordning efter färg) AS item_rank
FRÅN sahil.sample;
Och här är ett exempel på hur utdata från denna funktion kommer att se ut:
SQL-funktioner till räddning
SQLs fönsterfunktioner är idealiska för att utföra avancerade analytiska operationer. Du kan dock använda många andra SQL-kommandon för att säkerställa att dina beräkningsfärdigheter är förstklassiga. När du kombinerar och beräknar flera resultat på en gång finns det inget bättre än att använda SQLs underfrågor.
Underfrågor är ett utmärkt verktyg för att utföra avancerade funktioner, vilket förbättrar kvaliteten på dina resultat. Beroende på timmens behov kan du anpassa dina frågor och göra dem mer effektiva för att passa dina krav.