Обчислення медіани в SQL Server
У SQL Server немає функції MEDIAN(). Найближчий еквівалент — PERCENTILE_CONT(), яка знаходить значення на n-му процентилі в наборі даних.
Ми хочемо зʼясувати, наскільки медіана відрізняється від середнього для кожного типу інциденту в нашому підсумковому наборі інцидентів. Для цього можна порівняти AVG() з попередньої вправи з PERCENTILE_CONT(). Це віконні функції, які ми детальніше розглянемо в розділі 4. Поки що важливо знати, що PERCENTILE_CONT() приймає параметр — процентиль (десяткове число в діапазоні від 0 до 1). Процентиль має обчислюватися в упорядкованій групі в межах клаузи WITHIN GROUP і OVER певного діапазону, якщо потрібне розбиття даних на розділи. У секції WITHIN GROUP потрібно впорядкувати за стовпцем, для якого ми шукаємо 50-й процентиль.
Ця вправа є частиною курсу
Аналіз часових рядів у SQL Server
Інструкції до вправи
- Заповніть пропущене значення для
PERCENTILE_CONT(). - Усередині клаузи
WITHIN GROUP()виконайте впорядкування за кількістю інцидентів за спаданням. - У клаузі
OVER()виконайте розбиття на розділи заIncidentType(фактичним текстовим значенням, а не ідентифікатором).
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
SELECT DISTINCT
it.IncidentType,
AVG(CAST(ir.NumberOfIncidents AS DECIMAL(4,2)))
OVER(PARTITION BY it.IncidentType) AS MeanNumberOfIncidents,
--- Fill in the missing value
PERCENTILE_CONT(___)
-- Inside our group, order by number of incidents DESC
WITHIN GROUP (ORDER BY ir.___ DESC)
-- Do this for each IncidentType value
OVER (PARTITION BY it.___) AS MedianNumberOfIncidents,
COUNT(1) OVER (PARTITION BY it.IncidentType) AS NumberOfRows
FROM dbo.IncidentRollup ir
INNER JOIN dbo.IncidentType it
ON ir.IncidentTypeID = it.IncidentTypeID
INNER JOIN dbo.Calendar c
ON ir.IncidentDate = c.Date
WHERE
c.CalendarQuarter = 2
AND c.CalendarYear = 2020;