Beräkna median i SQL Server
Det finns ingen MEDIAN()-funktion i SQL Server. Det närmaste alternativet är PERCENTILE_CONT(), som hittar värdet vid den n:te percentilen i en datamängd.
Vi vill undersöka hur mycket medianen skiljer sig från medelvärdet per incidenttyp i vår sammanställning av incidenter. Det kan vi göra genom att jämföra AVG()-funktionen från föregående övning med PERCENTILE_CONT(). Det här är fönsterfunktioner, som vi går igenom mer ingående i kapitel 4. Tills vidare räcker det att veta att PERCENTILE_CONT() tar en parameter – percentilen (ett decimaltal mellan 0. och 1.). Percentilen måste anges inom en ordnad grupp i WITHIN GROUP-satsen, och du använder OVER för att partitionera data vid behov. I WITHIN GROUP-avsnittet anger du den kolumn vars 50:e percentil du vill beräkna.
Den här övningen är en del av kursen
Tidsserieanalys i SQL Server
Övningsinstruktioner
- Fyll i det saknade värdet för
PERCENTILE_CONT(). - Inuti
WITHIN GROUP()-satsen, sortera efter antal incidenter i fallande ordning. - I
OVER()-satsen, partitionera efterIncidentType(det faktiska textvärdet, inte ID:t).
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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;