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
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ů podleIncidentType(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;