Vad är fönsterfunktioner?
Fönsterfunktioner gör det möjligt för användare att utföra beräkningar mot partitioner (d.v.s. undergrupper eller sektioner) av en resultatuppsättning, vanligtvis en tabell eller resultaten från en annan fråga. Till skillnad från traditionella aggregeringsfunktioner, som endast returnerar ett enda värde för varje grupp som definieras i frågan, returnerar fönsterfunktioner ett enda värde för varje inmatningsrad.
Hur är fönsterfunktioner användbara?
Fönsterfunktioner ökar effektiviteten och minskar komplexiteten i frågor som analyserar partitioner (fönster) av en datamängd genom att tillhandahålla ett alternativ till mer komplexa SQL-koncept, t.ex. härledda frågor. Vanliga användningsfall inkluderar:
- Rankning av resultat inom ett specifikt fönster (t.ex. rankning per grupp)
- Åtkomst till data från en annan rad i ett specifikt fönster (t.ex. period-över-period-rapportering)
- Aggregation inom ett specifikt fönster (t.ex. löpande totaler):
Hur man använder fönsterfunktioner
Fönsterfunktioner initieras med OVER
sats, och är konfigurerade med hjälp av tre koncept:
- fönsterpartition (
PARTITION BY
) - grupperar rader i partitioner - fönsterbeställning (
ORDER BY
) - definierar ordningen eller sekvensen av rader inom varje fönster - fönsterram (
ROWS
) - definierar fönstret med hjälp av en offset från den angivna raden
Syntaxöversikt
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Definitioner
- expression_list:kommaseparerad lista med uttryck, vanligtvis kolumnnamn
- order_list:kommaseparerad lista med uttryck, vanligtvis kolumnnamn
- frame_clause:definiera offset med
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Exempel
Rankning:rankning per grupp
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
Föregående rad:period-över-period analys
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 inom ett fönster:löpande summor
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- och funktionslista:
Observera att det finns subtila skillnader i användning och syntax från databas till databas. För information som är specifik för din implementering, använd den källspecifika dokumentationen nedan.
Postgres
- Självstudie
- Funktioner
Rödskiftning
- Självstudie
- Funktioner
Oracle
- Självstudie
SQLServer
- Självstudie
BigQuery
- Självstudie