Calculando a mediana no SQL Server
Não existe a função MEDIAN() no SQL Server. O mais próximo que temos é PERCENTILE_CONT(), que encontra o valor no enésimo percentil em um conjunto de dados.
Queremos descobrir quanto a mediana difere da média por tipo de incidente no nosso conjunto agregado de incidentes. Para isso, podemos comparar a função AVG() do exercício anterior com PERCENTILE_CONT(). Essas são funções de janela, que veremos em mais detalhes no capítulo 4. Por enquanto, saiba que PERCENTILE_CONT() recebe um parâmetro, o percentil (um decimal de 0 a 1). O percentil deve estar dentro de um grupo ordenado na cláusula WITHIN GROUP e OVER um certo intervalo, caso você precise particionar os dados. Na seção WITHIN GROUP, precisamos ordenar pela coluna cujo 50º percentil queremos.
Este exercício faz parte do curso
Análise de Séries Temporais no SQL Server
Instruções do exercício
- Preencha o valor que falta em
PERCENTILE_CONT(). - Dentro da cláusula
WITHIN GROUP(), ordene pelo número de incidentes em ordem decrescente. - Na cláusula
OVER(), parta porIncidentType(o valor de texto real, não o ID).
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
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;