Inizia subitoInizia gratis

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

Visualizza corso

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 per IncidentType (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;
Modifica ed esegui il codice