CommencerCommencez gratuitement

Calculer la médiane dans SQL Server

Il n’existe pas de fonction MEDIAN() dans SQL Server. La plus proche est PERCENTILE_CONT(), qui renvoie la valeur au nᵉ centile d’un jeu de données.

Nous souhaitons mesurer l’écart entre la médiane et la moyenne par type d’incident dans notre ensemble récapitulatif des incidents. Pour cela, nous pouvons comparer la fonction AVG() de l’exercice précédent à PERCENTILE_CONT(). Ce sont des fonctions de fenêtre, que nous verrons plus en détail au chapitre 4. Pour l’instant, retenez que PERCENTILE_CONT() prend en paramètre le percentile (un décimal compris entre 0 et 1). Le percentile doit s’appliquer à un groupe ordonné dans la clause WITHIN GROUP et s’exécuter OVER une certaine plage si vous devez partitionner les données. Dans la section WITHIN GROUP, nous devons trier par la colonne dont nous voulons le 50e centile.

Cet exercice fait partie du cours

<cours>Analyse de séries temporelles dans SQL Server</cours>
Voir le cours

Instructions de l’exercice

  • Renseignez la valeur manquante pour PERCENTILE_CONT().
  • Dans la clause WITHIN GROUP(), triez par nombre d’incidents décroissant.
  • Dans la clause OVER(), partitionnez par IncidentType (la valeur textuelle, et non l’identifiant).

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

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;
Modifier et exécuter le code