Вычисление агрегатов с фильтрацией
Чтобы подсчитать количество вхождений события по заданному критерию фильтрации, можно воспользоваться агрегатными функциями SUM(), MIN() и MAX() в сочетании с выражениями CASE. Например, SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) вернёт количество инцидентов, относящихся к типу 1. Если добавить по одному оператору SUM() для каждого типа инцидентов, данные окажутся сведены в сводную таблицу по идентификатору типа инцидента.
В этом сценарии руководство хочет узнать, сколько «крупных» и «мелких» дней по инцидентам было зафиксировано в разрезе типов. Крупным считается день, в который произошло более 5 инцидентов одного типа, а мелким — день с числом инцидентов от 1 до 5.
Это упражнение является частью курса
Анализ временных рядов в SQL Server
Инструкции к упражнению
- Заполните выражение
CASE, которое позволит функцииSUM()вычислить количество крупных и мелких дней по инцидентам. - В выражении
CASEвозвращайте 1, если соответствующий критерий фильтрации выполнен, и 0 — в противном случае. - Обязательно указывайте псевдоним при обращении к столбцу, например
ir.IncidentDateилиit.IncidentType!
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
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;