SQL Server中如何不用OVER子句用PERCENTILE_CONT求整列中位数?有无替代方法?
SQL Server 整列中位数计算方案
方法一:使用PERCENTILE_CONT(无需分区)
PERCENTILE_CONT是SQL Server 2012及以上版本支持的函数,计算整列中位数时,不需要指定分区,直接用OVER ()即可,正确语法如下:
SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY your_column) OVER () AS median_value FROM your_table;
PERCENTILE_CONT(0.5)指定计算中位数(即50分位数)WITHIN GROUP (ORDER BY your_column)定义排序的目标列,这是函数的必填项OVER ()表示不对数据做分区,基于整个数据集计算中位数- 加
DISTINCT是因为函数会为原表每一行返回结果,去重后得到唯一的中位数
你之前尝试的OVER (PARTITION BY NULL)也能生效,但OVER ()是更简洁规范的写法。
方法二:兼容旧版本的替代方案
如果你的SQL Server版本低于2012,或者不想使用PERCENTILE_CONT,可以通过ROW_NUMBER和COUNT组合实现:
SELECT AVG(CAST(your_column AS DECIMAL(18,2))) AS median_value FROM ( SELECT your_column, ROW_NUMBER() OVER (ORDER BY your_column) AS row_num, COUNT(*) OVER () AS total_rows FROM your_table ) AS sub_query WHERE row_num IN ((total_rows + 1)/2, (total_rows + 2)/2);
- 子查询中为每行按目标列排序并分配行号,同时统计总行数
- 根据总行数的奇偶性,选取中间1行(奇数行)或2行(偶数行)
- 对选中的行取平均值,符合中位数的定义(偶数行时取中间两数的平均)
方法三:离散中位数计算(PERCENTILE_DISC)
如果需要直接返回数据集中的实际值(而非插值计算),可以用PERCENTILE_DISC函数:
SELECT DISTINCT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY your_column) OVER () AS median_value FROM your_table;
区别:PERCENTILE_CONT会在中间值不存在时插值生成结果,PERCENTILE_DISC则返回数据集中最接近中位数的实际存在值。
内容的提问来源于stack exchange,提问作者Fakhar
相关产品推荐
相关产品推荐

