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 binnen 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(): wijst 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 inngroepen en wijst een groepsnummer toe aan elke rij.
Voorbeeld
We rangschikken de verkopen op basis van het Amount voor elke ProductID in oplopende volgorde met behulp van de functie DENSE_RANK():
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 resultaatset bevat alle informatie uit de hoofdtafel en een extra kolom die de rang van elke verkoop voor het betreffende product weergeeft.
Waardevergelijkingsfuncties
Waardevergelijkingsvensterfuncties in SQL worden gebruikt om waarden in de huidige rij te vergelijken met waarden in andere rijen binnen dezelfde partitie.
Deze functies zijn met name nuttig voor taken waarbij trends worden geanalyseerd, berekeningen worden uitgevoerd op basis van aangrenzende rijen, of specifieke rijwaarden binnen een gedefinieerd venster worden opgehaald.
Er zijn verschillende waardevergelijkingsfuncties in SQL:
LAG(): haalt de waarde op uit een vorige rij in de resultaatset zonder dat een self-join nodig is;LEAD(): haalt de waarde op uit een volgende rij in de resultaatset zonder dat een self-join nodig is;FIRST_VALUE(): retourneert de waarde van de eerste rij in het vensterframe;LAST_VALUE(): retourneert de waarde van de laatste rij in het vensterframe.
Voorbeeld
We gebruiken de waardevergelijkingsvensterfunctie 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;
Hiermee kan eenvoudig informatie over verkoopverschillen voor elk specifiek product worden verkregen zonder gebruik te maken van subquery's of opgeslagen procedures.
Het is ook mogelijk om verschillen voor alle verkopen zonder partitionering te berekenen 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.55
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 binnen 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(): wijst 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 inngroepen en wijst een groepsnummer toe aan elke rij.
Voorbeeld
We rangschikken de verkopen op basis van het Amount voor elke ProductID in oplopende volgorde met behulp van de functie DENSE_RANK():
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 resultaatset bevat alle informatie uit de hoofdtafel en een extra kolom die de rang van elke verkoop voor het betreffende product weergeeft.
Waardevergelijkingsfuncties
Waardevergelijkingsvensterfuncties in SQL worden gebruikt om waarden in de huidige rij te vergelijken met waarden in andere rijen binnen dezelfde partitie.
Deze functies zijn met name nuttig voor taken waarbij trends worden geanalyseerd, berekeningen worden uitgevoerd op basis van aangrenzende rijen, of specifieke rijwaarden binnen een gedefinieerd venster worden opgehaald.
Er zijn verschillende waardevergelijkingsfuncties in SQL:
LAG(): haalt de waarde op uit een vorige rij in de resultaatset zonder dat een self-join nodig is;LEAD(): haalt de waarde op uit een volgende rij in de resultaatset zonder dat een self-join nodig is;FIRST_VALUE(): retourneert de waarde van de eerste rij in het vensterframe;LAST_VALUE(): retourneert de waarde van de laatste rij in het vensterframe.
Voorbeeld
We gebruiken de waardevergelijkingsvensterfunctie 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;
Hiermee kan eenvoudig informatie over verkoopverschillen voor elk specifiek product worden verkregen zonder gebruik te maken van subquery's of opgeslagen procedures.
Het is ook mogelijk om verschillen voor alle verkopen zonder partitionering te berekenen 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!