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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:05:32