SQLs alsidighed som et DBMS-forespørgselssprog er steget gennem årene. Dens ekspansive anvendelighed og alsidighed gør den til en alletiders favorit for enhver dataanalytiker.
Der er en del funktioner på avanceret niveau udover SQLs almindelige. Disse funktioner er almindeligvis kendt som vinduesfunktioner. Hvis du har at gøre med komplekse data og ønsker at udføre avancerede beregninger, kan du bruge dem til at udnytte dine data bedst muligt.
Vigtigheden af vinduesfunktioner
Flere vinduesfunktioner er tilgængelige i SQL, og hver vil hjælpe dig med at udføre en række beregninger. Fra oprettelse af partitioner til rangering af rækker eller tildeling af rækkenumre, gør disse vinduesfunktioner lidt af hvert.
Vinduesfunktioner er fordelagtige, når du anvender aggregerede funktioner over et bestemt datasæt eller samling af rækker. Disse funktioner går ud over de aggregeringsfunktioner, som GROUP BY leverer. Den største forskel er dog, at i modsætning til grupperingsfunktionen er dine data ikke kombineret i en enkelt række.
Du kan ikke bruge vinduesfunktioner i HVOR, FRA, og GRUPPE EFTER udsagn.
Syntaks for en vinduesfunktion
Når du henviser til en vinduesfunktion, skal du følge standardsyntaksstrukturen, så den fungerer korrekt. Hvis du strukturerer kommandoen forkert, får du en fejl, og din kode vil ikke køre.
Her er standardsyntaksen:
VÆLG kolonnenavn1,
{window_function}(kolonnenavn2)
OVER([OPDELING EFTER kolonnenavn1] [ORDNER EFTER kolonnenavn3]) SOM ny_kolonne
FRA tabelnavn;
Hvor:
- kolonnenavn 1 er det første kolonnenavn, du vil vælge.
- {window_function} er navnet på en aggregeret funktion som sum, avg, count, row_number, rank eller tæt_rank.
- kolonnenavn2 er navnet på den kolonne, som du anvender vinduesfunktionen på.
- kolonnenavn3 er det tredje kolonnenavn, som vil danne basis for partition.
- ny_kolonne er en etiket til den nye kolonne, du kan anvende ved hjælp af SOM søgeord.
- tabelnavn er navnet på kildetabellen.
Vinduesfunktioner er forskellige fra nogle af de mest grundlæggende SQL-kommandoer. I modsætning til aggregerede funktioner i SQL kan du bruge disse vinduesfunktioner til at udføre avancerede funktioner.
Forberedelse af datasættet
Du kan bruge OPRET TABEL erklæring til oprette en ny tabel i SQL. Her er et eksempeldatasæt, som denne vejledning vil bruge til at definere nogle vinduesfunktioner:
Bestillingsdato |
Kategori |
Farve |
Udsalgspris |
Antal |
---|---|---|---|---|
08-11-2016 |
Telefoner |
Sort |
907.152 |
6 |
12-06-2016 |
Bindemidler |
Grøn |
18.504 |
3 |
11-10-2015 |
Hårde hvidevarer |
Gul |
114.9 |
5 |
11-10-2015 |
Tabeller |
Brun |
1706.184 |
9 |
09-06-2014 |
Telefoner |
Rød |
911.424 |
4 |
09-06-2014 |
Papir |
hvid |
15.552 |
3 |
09-06-2014 |
Bindemidler |
Sort |
407.976 |
3 |
09-06-2014 |
Hårde hvidevarer |
Gul |
68.81 |
5 |
09-06-2014 |
Bindemidler |
Grøn |
2.544 |
3 |
09-06-2014 |
Opbevaring |
orange |
665.88 |
6 |
09-06-2014 |
Opbevaring |
orange |
55.5 |
2 |
15-04-2017 |
Telefoner |
Sort |
213.48 |
3 |
05-12-2016 |
Bindemidler |
Grøn |
22.72 |
4 |
22-11-2015 |
Hårde hvidevarer |
Grøn |
60.34 |
7 |
22-11-2015 |
Stole |
Mørkebrun |
71.372 |
2 |
13-05-2014 |
Møbel |
orange |
190.92 |
5 |
Sumfunktionen forklaret
Antag, at du vil beregne det samlede salg for hver værdi i kategorikolonnen. Sådan kan du gøre det:
VÆLGkategori, farve,
sum (udsalgspris)
OVER (ordre efter kategori) AS total_sales
FRA sahil.sample;
I ovenstående kode trækker SQL-sætningen kategorien og farven fra det originale datasæt. Sumfunktionen summerer kolonnen udsalgspris. Det gør det efter kategori, da OVER-sætningen angiver rækkefølge efter kategorikolonnen. Det endelige resultat er som følger:
Sådan bruger du Avg()-vinduefunktionen
Ligesom sumfunktionen kan du beregne gennemsnittet pr. række data med gns fungere. I stedet for summen får du en kolonne med det gennemsnitlige salg.
VÆLGkategori, farve,
gennemsnit (udsalgspris)
OVER (ordre efter kategori) AS avg_sales
FRA sahil.sample;
Lær at bruge Count()-vinduefunktionen
I lighed med sum- og avg-funktionerne er tællevinduefunktionen i SQL ret ligetil og fungerer på samme måde som de to andre funktioner. Når du består tællefunktionen, får du det samlede antal af hver værdi i den nye kolonne.
Sådan kan du beregne tallet:
VÆLGkategori, farve,
antal (kategori)
OVER (ordre efter kategori) AS item_count
FRA sahil.sample;
Row_Number() vinduesfunktionen
I modsætning til nogle af de andre vinduesfunktioner, der er anført ovenfor, fungerer row_number() lidt anderledes. Funktionen row_number() tildeler et rækkenummer til hver række, afhængigt af orden efter klausul. Startrækkenummeret er 1; rækkenummeret tildeler en tilsvarende værdi til hver række indtil slutningen.
Her er den grundlæggende struktur for en rækkenummer()-funktion:
VÆLGkategori, farve,
rækkenummer()
OVER (ordre efter kategori) AS varenummer
FRA sahil.sample;
Men hvad sker der, hvis du vil tildele separate rækkenumre til hvert kategorielement? Ovenstående syntaks angiver et rullende serienummer, uanset hvilke elementer der er gemt i kategorien. For eksempel skal apparaternes kategori have sin eksklusive nummerering, efterfulgt af ringbind og så videre.
Du kan bruge skillevæg funktion til at udføre denne enkle, men praktiske opgave. Partitionsnøgleordet tildeler udpegede rækkenumre på basis af hvert kategorielement.
VÆLGkategori, farve,
rækkenummer()
OVER (opdeling efter kategori rækkefølge efter kategori) AS item_number
FRA sahil.sample;
Funktionerne Rank() og Dense_Rank()
Det rang() funktionen fungerer anderledes end rækkenummer() fungere. Du skal angive kolonnenavnet i rækkefølgen efter funktion, for at bruge det som en base til at definere rangværdierne. I det følgende kodeeksempel kan du f.eks. bruge farvekolonnen i rækkefølge efter funktion. Forespørgslen vil derefter bruge denne rækkefølge til at tildele en rangværdi til hver række.
Du kan bruge kodesyntaksen nedenfor til at sende en rangfunktion i SQL:
VÆLGkategori, farve,
rang()
OVER (rækkefølge efter farve) AS item_rank
FRA sahil.sample;
Tag et kig på outputtet for at forstå, hvordan denne funktion fungerer.
Rækkefølgen efter funktion sorterer farvekategorien, mens rangfunktionen tildeler en rang til hver farve. Men alle de samme farveværdier har samme rang, mens de forskellige farver har separate rangordner. Farven sort forekommer tre gange i datasættet; i stedet for at tildele en rangværdi på 1, 2 og 3, får de sorte farveelementer en rang på 1.
Den næste farve Brown får dog en rang 4 i stedet for rang 2. Rangeringsfunktionen springer værdier over og tildeler den næste kronologiske værdi til de forskellige poster. Hvis du vil tildele en mere meningsfuld rangværdi, kan du bruge tæt_rang() fungere.
Dense_rank-funktionen springer ikke over nogen rangværdier under rækkefølgen efter funktion. For eksempel vil de første tre farveelementer (sort) have rang 1. Den følgende farve (Brun) vil dog ikke have en rang 4, men en rang 2, som er det følgende kronologiske tal i nummereringslisten. Dense_rank-funktionen er en mere praktisk vinduesfunktion, da den tildeler en meningsfuld værdi til listen over elementer.
Sådan kan du bruge dense_rank-funktionen i SQL:
VÆLGkategori, farve,
tæt_rang()
OVER (rækkefølge efter farve) AS item_rank
FRA sahil.sample;
Og her er et eksempel på, hvordan outputtet fra denne funktion vil se ud:
SQL-funktioner til undsætning
SQLs vinduesfunktioner er ideelle til at udføre avancerede analytiske operationer. Du kan dog bruge masser af andre SQL-kommandoer for at sikre, at dine beregningsevner er i top. Når du kombinerer og beregner flere resultater på én gang, er der ikke noget bedre end at bruge SQLs underforespørgsler.
Underforespørgsler er et fremragende værktøj til at udføre avancerede funktioner, der forbedrer dine resultaters kvalitet. Afhængigt af timens behov kan du tilpasse dine forespørgsler og gøre dem mere effektive, så de passer til dine krav.