Kom igångKom igång gratis

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

Visa kurs

Ö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 efter IncidentType (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;
Redigera och kör kod