ComeçarComece de graça

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

Ver curso

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 por IncidentType (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;
Editar e executar o código