0%

Vat veel rijen samen · oefening

Filter rijen voordat ze groepen vormen

De samenvatting van elektronica combineert momenteel een projector met twee en een halve dag en een luidspreker met twintig en een halve dag. Stel dat dit rapport alleen gaat over voorwerpen waarvan de gebruikelijke uitleentermijn veertien dagen of korter is. De luidspreker moet worden verwijderd voordat de totalen van zijn categorie worden berekend.

Open summary.sql. Voeg deze regel in tussen FROM items en GROUP BY category:

WHERE loan_days <= 14

Laat elke geselecteerde kolom, aggregatie, groepeersleutel en sorteerclausule ongewijzigd en druk op Run:

Columns: category | item_count | total_loan_days | shortest_loan_days | longest_loan_days | average_loan_days
electronics | 1 | 2.5 | 2.5 | 2.5 | 2.5
events | 2 | 21 | 7 | 14 | 10.5
tools | 2 | 10 | 3 | 7 | 5.0

De elektronicagroep bestaat nog, maar heeft nu één bijdragende rij. Het aantal, totaal, minimum, maximum en gemiddelde komen allemaal alleen van de projector. De luidspreker boven de limiet komt nooit in de groep terecht.

Volg die twee bronrijen door de beslissing:

Voorwerploan_days <= 14Komt in de elektronicagroep?
Projector, 2.5 dagenwaarja
Portable speaker, 20.5 dagenonwaarnee

Wanneer het groeperen begint, werkt SQLite voor elektronica alleen nog met de rij van de projector.

WHERE werkt op bronrijen. SQLite vergelijkt eerst de loan_days van elk voorwerp met 14 en behoudt de passende rijen. Pas daarna verzamelt GROUP BY category die overgebleven rijen en berekent het de aggregaties binnen elke groep.

De grens telt mee. Het projectiescherm heeft precies veertien dagen, dus <= 14 behoudt het. Met < 14 zou je de samenvatting van evenementen veranderen door een rij te verwijderen die de opdracht toestaat.

Deze werkvolgorde beantwoordt een andere vraag dan volledige categoriesamenvattingen berekenen en achteraf enkele waarden verbergen. Hier vraagt het rapport: “Hoe ziet elke categorie eruit als we alleen voorwerpen van veertien dagen of minder bekijken?” Elk getal moet op die kleinere bronverzameling zijn gebaseerd.

De categorie zelf wordt niet gefilterd. Elektronica blijft in de uitvoer staan omdat één van de rijen voldoet. Een categorie zou in deze fase alleen verdwijnen als geen van de bronrijen de WHERE-vergelijking doorstaat, zodat er niets overblijft om te groeperen.

Submit bevat een voorwerp boven de limiet waarvan het verwijderen het aantal, totaal, maximum en gemiddelde van de groep verandert. Het bevat ook een rij op de grens van veertien dagen. Als maar één getal verandert, controleer dan of de WHERE-clausule in de SQL vóór GROUP BY staat en geen berekening is die aan één resultaatexpressie is toegevoegd.

Je hebt WHERE al gebruikt om afzonderlijke zoekrijen te kiezen. Dezelfde clausule houdt hier die taak. Nieuw is dat je ziet hoe die beslissing doorwerkt in elke latere groepssamenvatting.

Opdracht

Voeg WHERE loan_days <= 14 toe tussen FROM items en GROUP BY category in summary.sql. Laat de volledige categoriesamenvatting ongewijzigd.

Voer de query uit en controleer of de rij boven de limiet aan geen van de waarden voor elektronica bijdraagt. Stuur hem daarna in.