Wat zijn vensterfuncties?
Met vensterfuncties kunnen gebruikers berekeningen uitvoeren op partities (d.w.z. subgroepen of secties) van een resultatenset, meestal een tabel of de resultaten van een andere query. In tegenstelling tot traditionele aggregatiefuncties, die slechts één waarde retourneren voor elke groep die in de query is gedefinieerd, retourneren vensterfuncties één enkele waarde voor elke invoerrij.
Hoe zijn vensterfuncties nuttig?
Vensterfuncties verhogen de efficiëntie en verminderen de complexiteit van query's die partities (vensters) van een gegevensset analyseren door een alternatief te bieden voor complexere SQL-concepten, b.v. afgeleide zoekopdrachten. Veelvoorkomende toepassingen zijn onder meer:
- Rangschikkingsresultaten binnen een specifiek venster (bijv. rangschikking per groep)
- Toegang tot gegevens uit een andere rij in een specifiek venster (bijv. periode-op-periode rapportage)
- Aggregatie binnen een specifiek venster (bijv. lopende totalen):
Vensterfuncties gebruiken
Vensterfuncties worden gestart met de OVER
clausule, en worden geconfigureerd met behulp van drie concepten:
- vensterpartitie (
PARTITION BY
) - groepeert rijen in partities - venster bestellen (
ORDER BY
) - definieert de volgorde of volgorde van rijen binnen elk venster - raamkozijn (
ROWS
) - definieert het venster met behulp van een offset van de opgegeven rij
Syntaxoverzicht
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Definities
- expression_list:door komma's gescheiden lijst van uitdrukkingen, meestal kolomnamen
- order_list:door komma's gescheiden lijst van uitdrukkingen, meestal kolomnamen
- frame_clause:definieer de offset met
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Voorbeelden
Ranking:rangschikking per groep
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
Vorige rij: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
Aggregatie binnen een venster:lopende totalen
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
Documentatie- en functielijst:
Houd er rekening mee dat er subtiele verschillen in gebruik en syntaxis bestaan van database tot database. Gebruik de bronspecifieke documentatie hieronder voor informatie die specifiek is voor uw implementatie.
Postgres
- Zelfstudie
- Functies
Roodverschuiving
- Zelfstudie
- Functies
Oracle
- Zelfstudie
SQLServer
- Zelfstudie
BigQuery
- Zelfstudie