Typen Vensterfuncties
Laten we kort de belangrijkste typen vensterfuncties verkennen die in SQL worden gebruikt.
Aggregatiefuncties
Dit zijn de standaard aggregatiefuncties (AVG
, SUM
, MAX
, MIN
, COUNT
) die in een venstercontext worden toegepast. We hebben dit type vensterfunctie al gebruikt in het vorige hoofdstuk.
Rangschikkingsfuncties
Rangschikkingsfuncties in SQL zijn een type vensterfunctie waarmee u een rang aan elke rij binnen een partitie van een resultaatset kunt toewijzen. Deze functies zijn bijzonder nuttig voor het uitvoeren van geordende berekeningen en analyses.
-
RANK()
: Wijs een unieke rang toe aan elke verschillende rij binnen de partitie op basis van deORDER BY
-clausule. Rijen met gelijke waarden krijgen dezelfde rang, waarbij er gaten in de rangschikking ontstaan; -
DENSE_RANK()
: Vergelijkbaar met RANK(), maar zonder gaten in de rangschikkingsvolgorde; -
NTILE(n)
: Verdeelt de rijen in een geordende partitie inn
groepen en wijst een groepsnummer toe aan elke rij.
Voorbeeld
We rangschikken de verkopen op basis van het Amount
voor elke ProductID
in oplopende volgorde door de functie DENSE_RANK()
te gebruiken:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
De resultaatstabel bevat alle informatie uit de hoofdtafel en een extra kolom die de rang van elke verkoop voor het betreffende product weergeeft.
Waardevergelijkingsfuncties
Waardevergelijkende vensterfuncties in SQL worden gebruikt om waarden in de huidige rij te vergelijken met waarden in andere rijen binnen dezelfde partitie.
Deze functies zijn bijzonder nuttig voor taken zoals het analyseren van trends, het uitvoeren van berekeningen op basis van aangrenzende rijen, of het benaderen van specifieke rijwaarden binnen een gedefinieerd venster.
Er zijn verschillende waardevergelijkingsfuncties in SQL:
LAG()
: Haalt de waarde op uit een vorige rij in het resultaat zonder dat een self-join nodig is;LEAD()
: Haalt de waarde op uit een volgende rij in het resultaat zonder dat een self-join nodig is;FIRST_VALUE()
: Geeft de waarde van de eerste rij in het vensterframe terug;LAST_VALUE()
: Geeft de waarde van de laatste rij in het vensterframe terug.
Voorbeeld
We gebruiken de waardevergelijkende vensterfunctie LAG()
om de verandering in verkoopbedrag ten opzichte van de vorige verkoop voor elk product te berekenen:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Hierdoor kunnen we eenvoudig informatie over verkoopverschillen voor elk specifiek product ophalen zonder subqueries of opgeslagen procedures te gebruiken.
We kunnen ook verschillen voor alle verkopen berekenen zonder te partitioneren met de volgende query:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Je ziet dat we de PARTITION BY
clausule niet hebben opgenomen in het OVER
-blok. Dit betekent dat we niet alleen de vorige waarden voor een specifiek product willen ophalen, maar voor alle verkopen in de tabel.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 4.35
Typen Vensterfuncties
Veeg om het menu te tonen
Laten we kort de belangrijkste typen vensterfuncties verkennen die in SQL worden gebruikt.
Aggregatiefuncties
Dit zijn de standaard aggregatiefuncties (AVG
, SUM
, MAX
, MIN
, COUNT
) die in een venstercontext worden toegepast. We hebben dit type vensterfunctie al gebruikt in het vorige hoofdstuk.
Rangschikkingsfuncties
Rangschikkingsfuncties in SQL zijn een type vensterfunctie waarmee u een rang aan elke rij binnen een partitie van een resultaatset kunt toewijzen. Deze functies zijn bijzonder nuttig voor het uitvoeren van geordende berekeningen en analyses.
-
RANK()
: Wijs een unieke rang toe aan elke verschillende rij binnen de partitie op basis van deORDER BY
-clausule. Rijen met gelijke waarden krijgen dezelfde rang, waarbij er gaten in de rangschikking ontstaan; -
DENSE_RANK()
: Vergelijkbaar met RANK(), maar zonder gaten in de rangschikkingsvolgorde; -
NTILE(n)
: Verdeelt de rijen in een geordende partitie inn
groepen en wijst een groepsnummer toe aan elke rij.
Voorbeeld
We rangschikken de verkopen op basis van het Amount
voor elke ProductID
in oplopende volgorde door de functie DENSE_RANK()
te gebruiken:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
De resultaatstabel bevat alle informatie uit de hoofdtafel en een extra kolom die de rang van elke verkoop voor het betreffende product weergeeft.
Waardevergelijkingsfuncties
Waardevergelijkende vensterfuncties in SQL worden gebruikt om waarden in de huidige rij te vergelijken met waarden in andere rijen binnen dezelfde partitie.
Deze functies zijn bijzonder nuttig voor taken zoals het analyseren van trends, het uitvoeren van berekeningen op basis van aangrenzende rijen, of het benaderen van specifieke rijwaarden binnen een gedefinieerd venster.
Er zijn verschillende waardevergelijkingsfuncties in SQL:
LAG()
: Haalt de waarde op uit een vorige rij in het resultaat zonder dat een self-join nodig is;LEAD()
: Haalt de waarde op uit een volgende rij in het resultaat zonder dat een self-join nodig is;FIRST_VALUE()
: Geeft de waarde van de eerste rij in het vensterframe terug;LAST_VALUE()
: Geeft de waarde van de laatste rij in het vensterframe terug.
Voorbeeld
We gebruiken de waardevergelijkende vensterfunctie LAG()
om de verandering in verkoopbedrag ten opzichte van de vorige verkoop voor elk product te berekenen:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Hierdoor kunnen we eenvoudig informatie over verkoopverschillen voor elk specifiek product ophalen zonder subqueries of opgeslagen procedures te gebruiken.
We kunnen ook verschillen voor alle verkopen berekenen zonder te partitioneren met de volgende query:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Je ziet dat we de PARTITION BY
clausule niet hebben opgenomen in het OVER
-blok. Dit betekent dat we niet alleen de vorige waarden voor een specifiek product willen ophalen, maar voor alle verkopen in de tabel.
Bedankt voor je feedback!