Výpočet filtrovaných agregátů
Pokud chceme spočítat počet výskytů určité události na základě zadaných kritérií, můžeme využít agregační funkce jako SUM(), MIN() a MAX() společně s výrazy CASE. Například SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) vrátí počet incidentů přiřazených k typu incidentu 1. Pokud přidáš jeden příkaz SUM() pro každý typ incidentu, přetransformujete (pivotujete) datovou sadu podle ID typu incidentu.
V tomto scénáři nás vedení žádá, abychom pro každý typ incidentu zjistili, kolik dnů bylo „velkých" a kolik „malých". Vedení definuje velký den jako den, kdy se stejný typ incidentu vyskytl více než 5krát, a malý den jako den s 1 až 5 výskyty.
Toto cvičení je součástí kurzu
Time Series Analysis in SQL Server
Pokyny k cvičení
- Doplň výraz
CASE, který ti umožní použít funkciSUM()k výpočtu počtu velkých a malých dnů. - Ve výrazu
CASEvrať hodnotu 1, pokud je splněná příslušná podmínka filtru, jinak vrať 0. - Nezapomeň uvádět alias při odkazování na sloupec, například
ir.IncidentDateneboit.IncidentType!
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
SELECT
it.IncidentType,
-- Fill in the appropriate expression
SUM(___ WHEN ir.NumberOfIncidents > 5 THEN ___ ELSE ___ ___) AS NumberOfBigIncidentDays,
-- Number of incidents will always be at least 1, so
-- no need to check the minimum value, just that it's
-- less than or equal to 5
SUM(___ WHEN ir.NumberOfIncidents <= 5 THEN ___ ELSE ___ ___) AS NumberOfSmallIncidentDays
FROM dbo.IncidentRollup ir
INNER JOIN dbo.IncidentType it
ON ir.IncidentTypeID = it.IncidentTypeID
WHERE
ir.IncidentDate BETWEEN '2019-08-01' AND '2019-10-31'
GROUP BY
it.IncidentType;