Вычисление медианы в SQL Server
В SQL Server нет функции MEDIAN(). Ближайшим аналогом является PERCENTILE_CONT(), которая находит значение на заданном процентиле в наборе данных.
Мы хотим выяснить, насколько медиана отличается от среднего значения для каждого типа инцидента в нашем сводном наборе. Для этого можно сравнить функцию 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;