SQL Server中不使用分区子句用PERCENTILE_DISC求列的中位数
解决SQL Server中用PERCENTILE_DISC计算整列中位数的问题
你遇到的问题其实是窗口函数的特性导致的——PERCENTILE_DISC作为窗口函数,会为原表的每一行都返回计算结果,所以你看到的“全1”其实是整个列的中位数(刚好是1)被重复输出了N次(N是表的行数),而不是函数本身出了问题。
要得到单个的整列中位数,可以用以下几种简单方法:
方法一:用DISTINCT去重
直接在查询外层加上DISTINCT,就能过滤掉重复的结果,只保留唯一的中位数:
SELECT DISTINCT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY my_value) OVER () AS median_value FROM my_table;
这里OVER ()等价于你原来的OVER (PARTITION BY NULL),都是将整个表作为一个分区计算,加上DISTINCT后就只会返回一行中位数结果。
方法二:结合子查询取单行结果
如果你需要在更复杂的查询逻辑中嵌入这个中位数计算,可以用子查询配合行号来取唯一结果:
SELECT median_value FROM ( SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY my_value) OVER () AS median_value, ROW_NUMBER() OVER () AS rn FROM my_table ) AS sub_query WHERE rn = 1;
这种方法通过ROW_NUMBER()标记行号,只取第一行的结果,同样能得到单个中位数。
补充小提示
PERCENTILE_DISC(0.5)返回的是离散型中位数,即原数据集中实际存在的数值;如果需要连续型中位数(可能是原数据中没有的插值结果),可以替换成PERCENTILE_CONT(0.5),用法和PERCENTILE_DISC完全一致。- 不需要额外加
PARTITION BY子句,OVER ()就默认把整个数据集作为一个分区,完全满足你“计算整列中位数”的需求。
内容的提问来源于stack exchange,提问作者sparc_spread
相关产品推荐
相关产品推荐

