Median in SQL Server berechnen
Es gibt keine MEDIAN()-Funktion in SQL Server. Am nächsten kommt PERCENTILE_CONT(), das den Wert am n-ten Perzentil in einem Datensatz ermittelt.
Wir möchten herausfinden, wie stark sich der Median vom Mittelwert nach Incident-Typ in unserem Incident-Rollup unterscheidet. Dazu können wir die AVG()-Funktion aus der vorherigen Übung mit PERCENTILE_CONT() vergleichen. Das sind Fensterfunktionen, die wir in Kapitel 4 ausführlicher behandeln. Für den Moment solltest du wissen, dass PERCENTILE_CONT() einen Parameter nimmt, das Perzentil (eine Dezimalzahl von 0 bis 1). Das Perzentil muss innerhalb einer geordneten Gruppe in der WITHIN GROUP-Klausel und OVER einem bestimmten Bereich liegen, wenn du die Daten partitionieren musst. Im Abschnitt WITHIN GROUP müssen wir nach der Spalte sortieren, deren 50. Perzentil wir ermitteln wollen.
Diese Übung ist Teil des Kurses
Zeitreihenanalyse in SQL Server
Anleitung zur Übung
- Fülle den fehlenden Wert für
PERCENTILE_CONT()aus. - Sortiere in der
WITHIN GROUP()-Klausel nach der Anzahl der Incidents absteigend. - Partitioniere in der
OVER()-Klausel nachIncidentType(dem tatsächlichen Textwert, nicht der ID).
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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;