开始使用免费开始使用

在 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;
编辑并运行代码