Calculer la médiane dans SQL Server
SQL Server n'a pas de fonction MEDIAN(). La plus proche est PERCENTILE_CONT(), qui trouve la valeur au n-ième centile dans un jeu de données.
Nous voulons déterminer à quel point la médiane diffère de la moyenne par type d'incident dans notre ensemble sommaire d'incidents. Pour ce faire, nous pouvons comparer la fonction AVG() de l'exercice précédent à PERCENTILE_CONT(). Ce sont des fonctions de fenêtrage que nous verrons plus en détail au chapitre 4. Pour l'instant, sachez que PERCENTILE_CONT() prend en paramètre le centile (un nombre décimal entre 0 et 1). Le centile doit être évalué dans un groupe ordonné à l'intérieur de la clause WITHIN GROUP et OVER une certaine plage si vous devez partitionner les données. Dans la section WITHIN GROUP, nous devons trier selon la colonne dont nous voulons le 50e centile.
Cette activité fait partie du cours
Analyse de séries chronologiques dans SQL Server
Instructions de l’exercice
- Insérez la valeur manquante pour
PERCENTILE_CONT(). - Dans la clause
WITHIN GROUP(), triez par nombre d'incidents en ordre décroissant. - Dans la clause
OVER(), partitionnez parIncidentType(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;