Titel: Geavanceerde T-SQL window functions: een uitgebreide gids met voorbeelden
Inleiding
Transact-SQL (T-SQL), de eigen uitbreiding van Microsoft op de SQL-taal, biedt een flinke set tools om databases te beheren op SQL Server en Azure SQL Database. Window functions krijgen daarbij veel aandacht, omdat je er ingewikkelde berekeningen mee maakt over sets rijen die bij de huidige rij horen. In dit artikel bekijk ik een paar geavanceerde T-SQL window functions en laat ik met praktische voorbeelden zien hoe je ze gebruikt.
Wat zijn window functions?
Window functions rekenen over een groep, of “window”, rijen die iets te maken hebben met de rij die nu verwerkt wordt. Met deze functies los je ingewikkelde queries op waarvoor je anders self-joins, cursors of andere constructies nodig hebt. De belangrijkste soorten window functions zijn ranking-, aggregatie- en distributiefuncties.
Geavanceerde window functions en hoe je ze gebruikt
LEADenLAG:
Met deze functies lees je data uit een andere rij zonder dat je de tabel aan zichzelf hoeft te joinen. LEAD geeft de waarde uit een volgende rij, LAG haalt de waarde uit een voorgaande rij.
Voorbeeld:
SELECT OrderID, OrderDate, LAG(OrderDate, 1) OVER (ORDER BY OrderDate) AS PreviousOrderDateFROM Orders;Dit voorbeeld toont bij elke order in de tabel Orders de datum van de vorige order.
FIRST_VALUEenLAST_VALUE:
FIRST_VALUE en LAST_VALUE geven de eerste en de laatste waarde van het opgegeven window frame.
Voorbeeld:
SELECT OrderID, OrderDate, FIRST_VALUE(OrderDate) OVER (ORDER BY OrderDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS FirstOrderDateFROM Orders;Dit voorbeeld toont bij elke order in de tabel Orders de datum van de eerste order in het window.
CUME_DIST:
CUME_DIST berekent de cumulatieve verdeling van een waarde in een groep waarden. Het is het aantal rijen met een waarde kleiner dan of gelijk aan de waarde van de huidige rij, gedeeld door het totale aantal rijen.
Voorbeeld:
SELECT OrderID, OrderDate, CUME_DIST() OVER (ORDER BY OrderDate) AS OrderDatePercentileFROM Orders;Dit voorbeeld toont het percentiel van elke orderdatum in de tabel Orders.
PERCENT_RANK:
PERCENT_RANK berekent de relatieve rang van een rij binnen een groep rijen.
Voorbeeld:
SELECT OrderID, OrderDate, PERCENT_RANK() OVER (ORDER BY OrderDate) AS OrderDatePercentRankFROM Orders;Dit voorbeeld toont de procentuele rang van elke orderdatum in de tabel Orders.
NTILE:
De functie NTILE verdeelt de rijen van een gesorteerde partitie over een opgegeven aantal groepen.
Voorbeeld:
SELECT OrderID, OrderDate, NTILE(4) OVER (ORDER BY OrderDate) AS QuartileFROM Orders;Dit voorbeeld verdeelt de orders in de tabel Orders in kwartielen op basis van de orderdatum.
Conclusie
Geavanceerde window functions in T-SQL zijn krachtige tools voor data-analyse en -transformatie. Als je deze functies begrijpt en gebruikt, schrijf je als developer of data-analist efficiëntere en schonere code, zonder ingewikkelde joins of subqueries. Met wat begrip en oefening pak je met deze window functions zelfs de lastigste datamanipulatie makkelijk aan.
Veelgestelde vragen
Wat is het verschil tussen LEAD en LAG in T-SQL?
LEAD geeft de waarde uit een volgende rij. LAG geeft de waarde uit een voorgaande rij. Met allebei lees je een andere rij zonder de tabel aan zichzelf te joinen.
Hoe haal ik de vorige orderdatum op in T-SQL?
Gebruik LAG over een gesorteerd window: LAG(OrderDate, 1) OVER (ORDER BY OrderDate) AS PreviousOrderDate. Zo krijg je bij elke order in de tabel Orders de datum van de vorige order.
Wat doen FIRST_VALUE en LAST_VALUE in SQL Server?
Ze geven de eerste en de laatste waarde van het opgegeven window frame. FIRST_VALUE met ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW toont bijvoorbeeld de datum van de eerste order.
Hoe verdeel ik rijen in kwartielen met NTILE in T-SQL?
Gebruik NTILE(4) OVER (ORDER BY OrderDate). NTILE verdeelt de rijen van een gesorteerde partitie over het aantal groepen dat je opgeeft, hier vier.
Wat berekenen CUME_DIST en PERCENT_RANK in T-SQL?
CUME_DIST is het aantal rijen met een waarde kleiner dan of gelijk aan de huidige rij, gedeeld door het totale aantal rijen. PERCENT_RANK berekent de relatieve rang van een rij binnen een groep rijen.
Reacties
Gerelateerde blogs
De 5 beste manieren om het CPU-gebruik van SQL Server te optimaliseren
Ontgrendel de Kracht van Klantgegevens met een Postcodetabel: Uw Gids voor Succesvolle Data-analyse
Disk performance metrics in SQL Server: een uitgebreide gids