Začněte nyníZačněte zdarma

Výpočet mediánu v SQL Serveru

V SQL Serveru neexistuje funkce MEDIAN(). Nejbližší alternativou je PERCENTILE_CONT(), která najde hodnotu na n-tém percentilu v datové sadě.

Chceme zjistit, jak moc se medián liší od průměru podle typu incidentu v naší souhrnné tabulce incidentů. K tomu porovnáme funkci AVG() z předchozího cvičení s funkcí PERCENTILE_CONT(). Obě jsou okenní funkce, kterým se podrobněji věnujeme ve 4. kapitole. Prozatím věz, že PERCENTILE_CONT() přijímá jeden parametr – percentil (desetinné číslo v rozsahu od 0. do 1.). Percentil musí být v rámci seřazené skupiny uvnitř klauzule WITHIN GROUP a funkce pracuje přes určitý rozsah definovaný v OVER, pokud potřebuješ data rozdělit do oddílů. V sekci WITHIN GROUP je třeba seřadit podle sloupce, jehož 50. percentil chceme zjistit.

Toto cvičení je součástí kurzu

Time Series Analysis in SQL Server

Zobrazit kurz

Pokyny k cvičení

  • Doplň chybějící hodnotu pro PERCENTILE_CONT().
  • Uvnitř klauzule WITHIN GROUP() seřaď data podle počtu incidentů sestupně.
  • V klauzuli OVER() rozděl data do oddílů podle IncidentType (skutečná textová hodnota, nikoli ID).

Interaktivní cvičení na vyzkoušení si v praxi

Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.

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;
Upravit a spustit kód