Calcular la mediana en SQL Server
En SQL Server no existe la función MEDIAN(). Lo más parecido es PERCENTILE_CONT(), que devuelve el valor en el enésimo percentil de un conjunto de datos.
Queremos averiguar cuánto se desvía la mediana de la media por tipo de incidente en nuestro conjunto resumido de incidentes. Para hacerlo, podemos comparar la función AVG() del ejercicio anterior con PERCENTILE_CONT(). Estas son funciones de ventana, que veremos con más detalle en el capítulo 4. Por ahora, ten en cuenta que PERCENTILE_CONT() recibe un parámetro, el percentil (un decimal entre 0 y 1). El percentil debe calcularse dentro de un grupo ordenado en la cláusula WITHIN GROUP y OVER un cierto rango si necesitas particionar los datos. En la sección WITHIN GROUP, debemos ordenar por la columna cuyo percentil 50 queremos obtener.
Este ejercicio forma parte del curso
Análisis de series temporales en SQL Server
Instrucciones del ejercicio
- Completa el valor que falta en
PERCENTILE_CONT(). - Dentro de la cláusula
WITHIN GROUP(), ordena por el número de incidentes en orden descendente. - En la cláusula
OVER(), particiona porIncidentType(el valor de texto real, no el ID).
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
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;