Hvad er vinduesfunktioner?
Vinduesfunktioner gør det muligt for brugere at udføre beregninger mod partitioner (dvs. undergrupper eller sektioner) af et resultatsæt, typisk en tabel eller resultaterne fra en anden forespørgsel. I modsætning til traditionelle aggregeringsfunktioner, som kun returnerer en enkelt værdi for hver gruppe defineret i forespørgslen, returnerer vinduesfunktioner en enkelt værdi for hver inputrække.
Hvordan er vinduesfunktioner nyttige?
Vinduesfunktioner øger effektiviteten og reducerer kompleksiteten af forespørgsler, der analyserer partitioner (vinduer) af et datasæt ved at give et alternativ til mere komplekse SQL-koncepter, f.eks. afledte forespørgsler. Almindelige brugstilfælde omfatter:
- Rangering af resultater inden for et specifikt vindue (f.eks. rangering pr. gruppe)
- Adgang til data fra en anden række i et bestemt vindue (f.eks. periodisk rapportering)
- Aggregation inden for et bestemt vindue (f.eks. løbende totaler):
Sådan bruges vinduesfunktioner
Vinduesfunktioner startes med OVER
klausul, og er konfigureret ved hjælp af tre koncepter:
- vinduespartition (
PARTITION BY
) - grupperer rækker i partitioner - vinduebestilling (
ORDER BY
) - definerer rækkefølgen eller rækkefølgen af rækker inden for hvert vindue - vinduesramme (
ROWS
) - definerer vinduet ved brug af en offset fra den angivne række
Syntaksoversigt
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Definitioner
- udtryksliste:kommasepareret liste over udtryk, typisk kolonnenavne
- ordre_list:kommasepareret liste over udtryk, typisk kolonnenavne
- frame_clause:definer offset ved hjælp af
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Eksempler
Rangering:rangering pr. gruppe
SELECT
campaign
, month
, total_cost
, rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8
Forrige række:periode-over-periode analyse
SELECT
campaign
, month
, total_cost
, LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4
Aggregation inden for et vindue:løbende totaler
SELECT
campaign, month, monthly_cost
, sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month
Dokumentations- og funktionsliste:
Bemærk venligst, at der er små forskelle i brug og syntaks fra database til database. For oplysninger, der er specifikke for din implementering, skal du bruge den kildespecifikke dokumentation, der er angivet nedenfor.
Postgres
- Selvstudie
- Funktioner
Rødskift
- Selvstudie
- Funktioner
Oracle
- Selvstudie
SQLServer
- Selvstudie
BigQuery
- Selvstudie