在 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;