Query's optimaliseren met FILTER en conditionele aggregatie
Leer hoe de FILTER-clausule en conditionele aggregatie op basis van CASE meerdere metrische waarden in één doorgang over een tabel berekenen in plaats van meerdere afzonderlijke query's uit te voeren.
Query's optimaliseren met FILTER en conditionele aggregatie is een gratis Prestaties en queryoptimalisatie in PostgreSQL-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Prestaties en queryoptimalisatie in PostgreSQL. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Prestaties en queryoptimalisatie in PostgreSQL bevat in totaal 4 lessen.
Het probleem: veel tellingen, één tabel
Dashboards hebben vaak meerdere statistieken uit dezelfde tabel nodig — het totale aantal bestellingen, betaalde bestellingen en terugbetaalde bestellingen. Met drie afzonderlijke queries wordt de tabel drie keer gescand. We kunnen dit in één doorgang doen.
Voorwaardelijke aggregatie met CASE
De klassieke truc wikkelt een CASE in een aggregatiefunctie. Rijen die niet overeenkomen leveren NULL op, wat COUNT en SUM negeren.
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid
FROM orders;De duidelijkere FILTER-component
PostgreSQL biedt een beter leesbare vorm: de FILTER-clausule die aan elk aggregaat kan worden gekoppeld. Hiermee geef je je bedoeling rechtstreeks aan.
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;Waarom dit sneller is
Alle statistieken worden berekend tijdens één enkele scan van de tabel. De planner leest elke rij één keer en werkt elk aggregaat bij, in plaats van de tabel voor elke statistiek afzonderlijk te scannen.
FILTER met SUM en AVG
FILTER werkt met elk aggregaat, niet alleen met COUNT. Bereken voorwaardelijke totalen en gemiddelden in dezelfde query.
SELECT
SUM(total) FILTER (WHERE status = 'paid') AS revenue,
AVG(total) FILTER (WHERE status = 'paid') AS avg_paid
FROM orders;Combineren met GROUP BY
FILTER komt goed tot zijn recht in gegroepeerde queries. Hiermee krijg je een resultaat dat op een draaitabel lijkt, met één rij per groep en meerdere voorwaardelijke kolommen.
SELECT
region,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders
GROUP BY region;Maanden omzetten in kolommen
Een veelvoorkomend rapport zet rijen om in kolommen. Met FILTER maak je een overzichtelijke maandelijkse draaitabel zonder uitbreidingsfuncties.
SELECT
product_id,
SUM(total) FILTER (WHERE month = 1) AS jan,
SUM(total) FILTER (WHERE month = 2) AS feb
FROM sales
GROUP BY product_id;Het plan lezen
EXPLAIN ANALYZE bevestigt dat er één Aggregate-knooppunt boven één scan staat. Vergelijk dit met drie afzonderlijke queries om te zien hoeveel scans je bespaart.
EXPLAIN ANALYZE
SELECT
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;FILTER tegenover WHERE
Onthoud het verschil:
- WHERE verwijdert rijen voordat een aggregaat ze kan zien
- FILTER behoudt alle rijen, maar beperkt welke rijen een specifiek aggregaat meetelt
Gebruik FILTER wanneer verschillende aggregaten verschillende voorwaarden nodig hebben.
Combineren met indexen
Als de meeste statistieken op een deelverzameling zijn gericht (bijvoorbeeld alleen recente rijen), voeg je een WHERE toe voor de gedeelde voorwaarde, zodat een index de scan beperkt. Gebruik daarna FILTER voor de opsplitsing per statistiek.
SELECT
COUNT(*) FILTER (WHERE status = 'paid') AS paid
FROM orders
WHERE created_at >= now() - interval '30 days';Voorwaardelijk unieke waarden tellen
FILTER kan ook worden gecombineerd met COUNT(DISTINCT ...), zodat je unieke klanten per status in één scan kunt tellen in plaats van in meerdere gegroepeerde queries.
SELECT
COUNT(DISTINCT customer_id) FILTER (WHERE status = 'paid') AS paying_customers
FROM orders;Korte toets
Toets je kennis van voorwaardelijke aggregatie.
Samenvatting
Je hebt voorwaardelijke aggregatie geleerd:
- Bereken veel statistieken in één scan met FILTER of CASE
- FILTER is beter leesbaar en werkt met elk aggregaat
- Combineer het met GROUP BY voor rapporten in draaitabelstijl
- WHERE verwijdert rijen; FILTER beperkt één aggregaat
- Voeg een gedeelde WHERE toe zodat indexen de scan beperken
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 22
- Lessen
- 88
Veelgestelde vragen
Is de les “Query's optimaliseren met FILTER en conditionele aggregatie” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Prestaties en queryoptimalisatie in PostgreSQL, waaronder “Query's optimaliseren met FILTER en conditionele aggregatie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Prestaties en queryoptimalisatie in PostgreSQL bevat in totaal 4 lessen.
Wat leer ik in “Query's optimaliseren met FILTER en conditionele aggregatie”?
Leer hoe de FILTER-clausule en conditionele aggregatie op basis van CASE meerdere metrische waarden in één doorgang over een tabel berekenen in plaats van meerdere afzonderlijke query's uit te voeren. Je oefent met Prestaties en queryoptimalisatie in PostgreSQL door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Prestaties en queryoptimalisatie in PostgreSQL te beginnen?
Ervaring vooraf is niet nodig. Prestaties en queryoptimalisatie in PostgreSQL op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Query's optimaliseren met FILTER en conditionele aggregatie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Prestaties en queryoptimalisatie in PostgreSQL?
Ja. Elke les over Prestaties en queryoptimalisatie in PostgreSQL bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Aggregaties en windowfuncties optimaliseren
- Recursieve CTE's en graafquery's
- Materialized views gebruiken voor betere prestaties
- Query's optimaliseren met FILTER en conditionele aggregatie