Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

Svestranost SQL-a kao upitnog jezika DBMS-a porasla je tijekom godina. Njegova ekspanzivna korisnost i svestranost čine ga omiljenim za sva vremena za svakog analitičara podataka.

Postoji dosta funkcija napredne razine osim uobičajenih SQL-ovih. Ove funkcije su poznate kao prozorske funkcije. Ako radite sa složenim podacima i želite izvršiti napredne izračune, možete ih upotrijebiti kako biste najbolje iskoristili svoje podatke.

Važnost funkcija prozora

Nekoliko prozorskih funkcija dostupno je u SQL-u i svaka će vam pomoći u izvođenju niza izračuna. Od stvaranja particija do rangiranja redaka ili dodjele brojeva redaka, ove prozorske funkcije rade pomalo od svega.

Funkcije prozora korisne su kada primjenjujete agregatne funkcije na određeni skup podataka ili zbirku redaka. Ove funkcije nadilaze funkcije agregacije koje pruža GROUP BY. Međutim, glavna je razlika u tome što se, za razliku od funkcije grupiranja, vaši podaci ne kombiniraju u jedan redak.

Ne možete koristiti funkcije prozora unutar GDJE, IZ, i GRUPIRAJ PO izjave.

Sintaksa funkcije prozora

Kada govorite o bilo kojoj funkciji prozora, morate slijediti zadanu strukturu sintakse kako bi ispravno funkcionirala. Ako strukturirate naredbu netočno, dobit ćete pogrešku i vaš se kôd neće moći pokrenuti.

Evo zadane sintakse:

IZABERI naziv stupca1,
{window_function}(columnname2)
OVER([PARTICIJA PO nazivu stupca1] [POREDAK PO nazivu stupca3]) KAO novi_stupac
FROM ime_tablice;

Gdje:

  • naziv stupca1 je prvi naziv stupca koji želite odabrati.
  • {funkcija_prozora} je naziv agregatne funkcije kao što je sum, avg, count, row_number, rank ili dense_rank.
  • naziv stupca2 je naziv stupca na koji primjenjujete funkciju prozora.
  • naziv stupca3 je treći naziv stupca, koji će činiti osnovu za particiju.
  • novi_stupac je oznaka za novi stupac koji možete primijeniti pomoću KAO ključna riječ.
  • naziv_tablice je naziv izvorne tablice.

Funkcije prozora razlikuju se od nekih najosnovnije SQL naredbe. Za razliku od agregatnih funkcija u SQL-u, ove prozorske funkcije možete koristiti za izvođenje naprednih funkcija.

Priprema skupa podataka

Možete koristiti STVARANJE TABLICE izjava za stvoriti novu tablicu u SQL-u. Evo uzorka skupa podataka koji će ovaj vodič koristiti za definiranje nekih funkcija prozora:

Datum narudžbe

Kategorija

Boja

Prodajna cijena

Količina

08-11-2016

telefoni

Crno

907.152

6

12-06-2016

Veziva

zelena

18.504

3

11-10-2015

Uređaji

Žuta boja

114.9

5

11-10-2015

Stolovi

Smeđa

1706.184

9

09-06-2014

telefoni

Crvena

911.424

4

09-06-2014

Papir

Bijela

15.552

3

09-06-2014

Veziva

Crno

407.976

3

09-06-2014

Uređaji

Žuta boja

68.81

5

09-06-2014

Veziva

zelena

2.544

3

09-06-2014

Skladištenje

naranča

665.88

6

09-06-2014

Skladištenje

naranča

55.5

2

15-04-2017

telefoni

Crno

213.48

3

05-12-2016

Veziva

zelena

22.72

4

22-11-2015

Uređaji

zelena

60.34

7

22-11-2015

Stolice

Tamno smeđa

71.372

2

13-05-2014

Namještaj

naranča

190.92

5

Objašnjenje funkcije zbroja

Pretpostavimo da želite izračunati ukupnu prodaju za svaku vrijednost unutar stupca kategorije. Evo kako to možete učiniti:

IZABERIkategorija, boja,
zbroj (prodajna_cijena)
PREKO (poredak po kategoriji) AS total_sales
OD sahil.uzorak;

U gornjem kodu, SQL izjava povlači kategoriju i boju iz izvornog skupa podataka. Funkcija sum zbraja stupac sale_price. To čini prema kategoriji, budući da klauzula OVER specificira poredak prema stupcu kategorije. Konačni rezultat je sljedeći:

Kako koristiti funkciju prozora Avg().

Poput funkcije zbroja, možete izračunati prosjek po retku podataka pomoću prosj funkcija. Umjesto zbroja, dobit ćete stupac s prosječnom prodajom.

IZABERIkategorija, boja,
prosječna (prodajna_cijena)
PREKO (poredak po kategoriji) AS avg_sales
OD sahil.uzorak;

Naučite koristiti funkciju prozora Count().

Slično funkcijama sum i avg, funkcija prozora brojanja u SQL-u prilično je jednostavna i radi na isti način kao i druge dvije funkcije. Kada prođete funkciju brojanja, dobivate ukupni broj svake vrijednosti unutar novog stupca.

Evo kako možete izračunati broj:

IZABERIkategorija, boja,
broj (kategorija)
PREKO (poredak po kategoriji) AS item_count
OD sahil.uzorak;

Funkcija prozora Row_Number().

Za razliku od nekih drugih gore navedenih prozorskih funkcija, row_number() radi malo drugačije. Funkcija row_number() dodjeljuje broj retka svakom retku, ovisno o redoslijedu prema klauzuli. Početni broj reda je 1; row_number dodjeljuje odgovarajuću vrijednost svakom retku do kraja.

Evo osnovne strukture funkcije row_number():

IZABERIkategorija, boja,
broj_reda()
PREKO (poredak po kategoriji) AS item_number
OD sahil.uzorak;

Ali što se događa ako svakoj stavci kategorije želite dodijeliti zasebne brojeve redaka? Gornja sintaksa postavlja tekući serijski broj, bez obzira na stavke pohranjene unutar kategorije. Na primjer, kategorija uređaja trebala bi imati svoj isključivi broj, nakon kojeg slijede registratori i tako dalje.

Možete koristiti pregrada funkciju za obavljanje ovog jednostavnog, ali praktičnog zadatka. Ključna riječ particije dodjeljuje određene brojeve redaka na temelju svake stavke kategorije.

IZABERIkategorija, boja,
broj_reda()
OVER (podjela po kategoriji poredak po kategoriji) AS item_number
OD sahil.uzorak;

Funkcije Rank() i Dense_Rank().

The rang() funkcija radi drugačije od broj_reda() funkcija. Morate navesti naziv stupca unutar reda prema funkciji, kako biste ga koristili kao osnovu za definiranje vrijednosti ranga. Na primjer, u sljedećem primjeru koda možete koristiti stupac boja unutar reda prema funkciji. Upit će zatim koristiti taj redoslijed za dodjeljivanje vrijednosti ranga svakom retku.

Možete upotrijebiti donju sintaksu koda za prosljeđivanje funkcije rangiranja u SQL-u:

IZABERIkategorija, boja,
rang()
PREKO (poredak po boji) AS item_rank
OD sahil.uzorak;

Pogledajte izlaz da biste razumjeli kako ova funkcija radi.

Redoslijed po funkciji razvrstava kategoriju boja, dok funkcija rangiranja dodjeljuje rang svakoj boji. Međutim, sve iste vrijednosti boja imaju isti rang, dok različite boje imaju različite rangove. Crna boja pojavljuje se tri puta unutar skupa podataka; umjesto dodjele vrijednosti ranga 1, 2 i 3, stavke crne boje dobivaju rang 1.

Međutim, sljedeća boja smeđa dobiva rang 4 umjesto ranga 2. Funkcija ranga preskače vrijednosti i dodjeljuje sljedeću kronološku vrijednost različitim unosima. Ako želite dodijeliti značajniju vrijednost ranga, možete koristiti gust_rang() funkcija.

Funkcija dense_rank ne preskače nijednu vrijednost ranga tijekom reda po funkciji. Na primjer, prve tri stavke u boji (crna) imat će rang 1. Međutim, sljedeća boja (smeđa) neće imati rang 4, već rang 2, što je sljedeći kronološki broj na popisu numeriranja. Funkcija dense_rank praktičnija je prozorska funkcija jer popisu stavki dodjeljuje značajnu vrijednost.

Evo kako možete koristiti funkciju dense_rank u SQL-u:

IZABERIkategorija, boja,
gust_rang()
PREKO (poredak po boji) AS item_rank
OD sahil.uzorak;

Evo primjera kako će izgledati izlaz ove funkcije:

SQL funkcije u pomoć

Funkcije prozora SQL-a idealne su za izvođenje naprednih analitičkih operacija. Međutim, možete koristiti mnoštvo drugih SQL naredbi kako biste bili sigurni da su vaše računalne vještine vrhunske. Kada kombinirate i izračunavate više rezultata odjednom, nema ništa bolje od korištenja SQL podupita.

Podupiti su izvrstan alat za izvođenje naprednih funkcija, čime se poboljšava kvaliteta vaših rezultata. Ovisno o potrebi sata, možete prilagoditi svoje upite i učiniti ih učinkovitijima kako bi odgovarali vašim zahtjevima.