SQL, kaip DBVS užklausų kalbos, universalumas bėgant metams išaugo. Dėl plataus naudojimo ir universalumo jis yra visų laikų mėgstamiausias kiekvieno duomenų analitiko.
Be įprastų SQL, yra nemažai išplėstinio lygio funkcijų. Šios funkcijos paprastai žinomos kaip langų funkcijos. Jei dirbate su sudėtingais duomenimis ir norite atlikti išplėstinius skaičiavimus, galite juos naudoti norėdami kuo geriau panaudoti duomenis.
Langų funkcijų svarba
SQL galimos kelios lango funkcijos, ir kiekviena iš jų padės atlikti daugybę skaičiavimų. Nuo skaidinių kūrimo iki eilučių reitingavimo ar eilučių numerių priskyrimo šios lango funkcijos atlieka šiek tiek visko.
Langų funkcijos yra naudingos, kai taikote suvestines funkcijas konkrečiam duomenų rinkiniui arba eilučių rinkiniui. Šios funkcijos viršija GROUP BY teikiamas agregavimo funkcijas. Tačiau pagrindinis skirtumas yra tas, kad, skirtingai nei grupavimo funkcija, jūsų duomenys nėra sujungti į vieną eilutę.
Negalite naudoti lango funkcijų KUR, NUO, ir GRUPUOTI PAGAL pareiškimus.
Lango funkcijos sintaksė
Kai nurodote bet kurią lango funkciją, turite laikytis numatytosios sintaksės struktūros, kad ji veiktų tinkamai. Jei neteisingai susisteminsite komandą, gausite klaidą ir jūsų kodas nebus paleistas.
Štai numatytoji sintaksė:
PASIRINKTI stulpelio pavadinimas1,
{lango_funkcija}(2 stulpelio pavadinimas)
OVER([PARTITION BY stulpelio pavadinimas1] [ORDER BY stulpelio pavadinimas3]) AS naujas_stulpelis
FROM lentelės_pavadinimas;
Kur:
- stulpelio pavadinimas1 yra pirmojo stulpelio pavadinimas, kurį norite pasirinkti.
- {lango_funkcija} yra suvestinės funkcijos pavadinimas, pvz., suma, vidurkis, skaičius, eilutės_skaičius, rangas arba tankus_rangas.
- stulpelio pavadinimas2 yra stulpelio, kuriame taikote lango funkciją, pavadinimas.
- stulpelio pavadinimas3 yra trečiojo stulpelio pavadinimas, kuris sudarys skaidinio pagrindą.
- naujas_stulpelis yra naujo stulpelio etiketė, kurią galite pritaikyti naudodami AS raktažodį.
- lentelės_pavadinimas yra šaltinio lentelės pavadinimas.
Langų funkcijos skiriasi nuo kai kurių pagrindinės SQL komandos. Skirtingai nuo SQL agregatų funkcijų, šias lango funkcijas galite naudoti išplėstinėms funkcijoms atlikti.
Duomenų rinkinio paruošimas
Galite naudoti KURTI LENTELĘ pareiškimas į sukurti naują lentelę SQL. Pateikiame pavyzdinį duomenų rinkinį, kurį šis vadovas naudos kai kurioms lango funkcijoms apibrėžti:
Užsakymo data |
Kategorija |
Spalva |
Pardavimo kaina |
Kiekis |
---|---|---|---|---|
08-11-2016 |
Telefonai |
Juoda |
907.152 |
6 |
12-06-2016 |
Segtuvai |
Žalias |
18.504 |
3 |
11-10-2015 |
Prietaisai |
Geltona |
114.9 |
5 |
11-10-2015 |
Lentelės |
Ruda |
1706.184 |
9 |
09-06-2014 |
Telefonai |
Raudona |
911.424 |
4 |
09-06-2014 |
Popierius |
Baltas |
15.552 |
3 |
09-06-2014 |
Segtuvai |
Juoda |
407.976 |
3 |
09-06-2014 |
Prietaisai |
Geltona |
68.81 |
5 |
09-06-2014 |
Segtuvai |
Žalias |
2.544 |
3 |
09-06-2014 |
Sandėliavimas |
Oranžinė |
665.88 |
6 |
09-06-2014 |
Sandėliavimas |
Oranžinė |
55.5 |
2 |
15-04-2017 |
Telefonai |
Juoda |
213.48 |
3 |
05-12-2016 |
Segtuvai |
Žalias |
22.72 |
4 |
22-11-2015 |
Prietaisai |
Žalias |
60.34 |
7 |
22-11-2015 |
Kėdės |
Tamsiai rudas |
71.372 |
2 |
13-05-2014 |
Baldai |
Oranžinė |
190.92 |
5 |
Paaiškinta sumos funkcija
Tarkime, kad norite apskaičiuoti bendrą kiekvienos kategorijos stulpelio vertės pardavimą. Štai kaip tai galite padaryti:
PASIRINKTIKategorija, spalva,
suma (pardavimo_kaina)
OVER (tvarka pagal kategoriją) AS total_sales
IŠ sahil.sample;
Aukščiau pateiktame kode SQL sakinys ištraukia kategoriją ir spalvą iš pradinio duomenų rinkinio. Sumos funkcija sudeda stulpelį sale_price. Tai atliekama pagal kategorijas, nes OVER sąlyga nurodo tvarką pagal kategorijos stulpelį. Galutinis rezultatas yra toks:
Kaip naudoti lango funkciją Avg()
Kaip ir sumos funkcija, galite apskaičiuoti duomenų eilutės vidurkį naudodami vid funkcija. Vietoj sumos gausite stulpelį su vidutiniais pardavimais.
PASIRINKTIKategorija, spalva,
vid. (pardavimo_kaina)
OVER (tvarka pagal kategoriją) AS avg_sales
IŠ sahil.sample;
Išmokite naudoti lango funkciją „Count()“.
Panašiai kaip sumos ir vidurkio funkcijos, skaičiavimo lango funkcija SQL yra gana paprasta ir veikia taip pat, kaip ir kitos dvi funkcijos. Kai perduodate skaičiavimo funkciją, gaunate bendrą kiekvienos vertės skaičių naujame stulpelyje.
Štai kaip galite apskaičiuoti skaičių:
PASIRINKTIKategorija, spalva,
skaičius (kategorija)
OVER (tvarka pagal kategoriją) AS item_count
IŠ sahil.sample;
Eilutės_numerio() lango funkcija
Skirtingai nuo kai kurių kitų aukščiau išvardytų lango funkcijų, eilutės_numeris () veikia šiek tiek kitaip. Funkcija row_number() kiekvienai eilutei priskiria eilutės numerį, priklausomai nuo eilės pagal sąlygą. Pradinės eilutės numeris yra 1; eilutės_numeris kiekvienai eilutei iki galo priskiria atitinkamą reikšmę.
Štai pagrindinė funkcijos row_number() struktūra:
PASIRINKTIKategorija, spalva,
eilutės_numeris()
OVER (tvarka pagal kategoriją) AS prekės_numeris
IŠ sahil.sample;
Bet kas atsitiks, jei kiekvienam kategorijos elementui norite priskirti atskirus eilučių numerius? Aukščiau pateikta sintaksė nustato slenkantį serijos numerį, neatsižvelgiant į kategorijoje saugomus elementus. Pavyzdžiui, prietaisų kategorija turi turėti išskirtinę numeraciją, po kurios – segtuvai ir pan.
Galite naudoti pertvara atlikti šią paprastą, tačiau praktišką užduotį. Padalinio raktinis žodis priskiria paskirtus eilučių numerius pagal kiekvieną kategorijos elementą.
PASIRINKTIKategorija, spalva,
eilutės_numeris()
OVER (skirstymas pagal kategorijas, tvarka pagal kategoriją) AS elemento_numeris
IŠ sahil.sample;
Rank() ir Dense_Rank() funkcijos
The rangas () funkcija veikia kitaip nei eilutės_numeris() funkcija. Turite nurodyti stulpelio pavadinimą eilės tvarka pagal funkciją, kad galėtumėte jį naudoti kaip pagrindą rango reikšmėms apibrėžti. Pavyzdžiui, šiame kodo pavyzdyje galite naudoti spalvų stulpelį užsakymo pagal funkciją. Tada užklausa naudos tą tvarką, kad kiekvienai eilutei priskirtų rango reikšmę.
Norėdami perduoti rango funkciją SQL, galite naudoti toliau pateiktą kodo sintaksę:
PASIRINKTIKategorija, spalva,
rangas ()
OVER (užsakyti pagal spalvą) AS item_rank
IŠ sahil.sample;
Pažvelkite į išvestį, kad suprastumėte, kaip ši funkcija veikia.
Tvarka pagal funkciją rūšiuoja spalvų kategoriją, o rango funkcija kiekvienai spalvai priskiria reitingą. Tačiau visos tos pačios spalvų reikšmės turi tą patį rangą, o skirtingos spalvos turi atskirus rangus. Juoda spalva duomenų rinkinyje pasitaiko tris kartus; užuot priskyrę 1, 2 ir 3 rango reikšmę, juodos spalvos elementai gauna 1 reitingą.
Tačiau kita spalva ruda gauna 4, o ne 2 reitingą. Reitingavimo funkcija praleidžia reikšmes ir skirtingiems įrašams priskiria kitą chronologinę reikšmę. Jei norite priskirti prasmingesnę rango reikšmę, galite naudoti tankus_rankas() funkcija.
Funkcija tankus_rankas nepraleidžia jokių rango reikšmių tvarkant pagal funkciją. Pavyzdžiui, pirmieji trys spalvų elementai (juoda) turės 1 reitingą. Tačiau ši spalva (ruda) turės ne 4, o 2 rangą, kuris yra chronologinis skaičius numeravimo sąraše. Funkcija tankus_rankas yra praktiškesnė lango funkcija, nes ji elementų sąrašui priskiria reikšmingą reikšmę.
Štai kaip galite naudoti funkciją dense_rank SQL:
PASIRINKTIKategorija, spalva,
tankus_rankas()
OVER (užsakyti pagal spalvą) AS item_rank
IŠ sahil.sample;
Ir štai pavyzdys, kaip atrodys šios funkcijos išvestis:
SQL funkcijos į gelbėjimą
SQL lango funkcijos idealiai tinka pažangioms analitinėms operacijoms atlikti. Tačiau galite naudoti daugybę kitų SQL komandų, kad įsitikintumėte, jog jūsų skaičiavimo įgūdžiai yra aukščiausio lygio. Kai vienu kartu sujungiate ir apskaičiuojate kelis rezultatus, nėra nieko geriau, kaip naudoti SQL antrines užklausas.
Antrinės užklausos yra puikus įrankis išplėstinėms funkcijoms atlikti, gerinant rezultatų kokybę. Atsižvelgdami į valandos poreikį, galite tinkinti savo užklausas ir padaryti jas efektyvesnes, kad atitiktų jūsų poreikius.