Calcolare la mediana in SQL Server
In SQL Server non esiste la funzione MEDIAN(). L’alternativa più vicina è PERCENTILE_CONT(), che trova il valore all’n-esimo percentile su un insieme di dati.
Vogliamo capire quanto la mediana differisca dalla media per tipo di incidente nel nostro set di rollup degli incidenti. Per farlo, possiamo confrontare la funzione AVG() dell’esercizio precedente con PERCENTILE_CONT(). Si tratta di funzioni finestra, che vedremo in più dettaglio nel capitolo 4. Per ora, sappi che PERCENTILE_CONT() accetta un parametro, il percentile (un decimale compreso tra 0 e 1). Il percentile deve essere definito all’interno di un gruppo ordinato nella clausola WITHIN GROUP e con OVER su un certo intervallo se devi partizionare i dati. Nella sezione WITHIN GROUP, dobbiamo ordinare per la colonna di cui vogliamo il 50º percentile.
Questo esercizio fa parte del corso
Analisi delle serie temporali in SQL Server
Istruzioni dell'esercizio
- Inserisci il valore mancante per
PERCENTILE_CONT(). - All’interno della clausola
WITHIN GROUP(), ordina per numero di incidenti in ordine decrescente. - Nella clausola
OVER(), esegui la partition perIncidentType(il valore testuale effettivo, non l’ID).
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
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;