You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:20:06