НачатьНачать бесплатно

Вычисление агрегатов с фильтрацией

Чтобы подсчитать количество вхождений события по заданному критерию фильтрации, можно воспользоваться агрегатными функциями 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;
Редактировать и запускать код