開始使用免費開始

在 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;
編輯並執行程式碼