在 SQL Server 計算中位數
SQL Server 沒有 MEDIAN() 函式。最接近的是 PERCENTILE_CONT(),它會在整個資料集中找出第 n 個百分位數所對應的值。
我們想要知道在事故彙總資料中,各事故類型的中位數與平均數相差多少。為此,你可以把前一個練習中的 AVG() 與 PERCENTILE_CONT() 進行比較。這些都是視窗函式,我們會在第 4 章更詳細說明。現在先知道 PERCENTILE_CONT() 會接受一個參數,也就是百分位數(介於 0 到 1 的小數)。若需要分割資料,百分位數必須在 WITHIN GROUP 子句中定義的排序群組內,並在 OVER 指定的範圍上計算。在 WITHIN GROUP 區段中,我們需要依要取第 50 個百分位數的欄位進行排序。
本練習屬於課程
SQL Server 的時間序列分析
練習說明
- 補上
PERCENTILE_CONT()所缺的值。 - 在
WITHIN GROUP()子句中,依事故數量由大到小排序。 - 在
OVER()子句中,依IncidentType(實際的文字值,不是 ID)進行分割。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
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;