求助:按ID、Month、Section分组计算SQL数据集中位数
修正后的中位数计算SQL代码
一、NTILE() 实现(近似中位数)
原代码存在以下问题:
- PARTITION BY语法错误,未指定正确分组字段,且包含无关的
[bestCT] - ORDER BY逻辑错误,应按目标字段
BestTime排序而非Section - NTILE(4)用于四分位数计算,不适合中位数场景,改用NTILE(2)拆分数据为上下两半
修正后的代码:
SELECT ID, [Month], Section, MIN(BestTime) AS Median FROM ( SELECT ID, [Month], Section, BestTime, NTILE(2) OVER(PARTITION BY ID, [Month], Section ORDER BY BestTime) AS Half FROM MonthlyCycleTime SK ) X WHERE Half = 2 GROUP BY ID, [Month], Section
注:如果分组内数据行数为奇数,NTILE(2)会让上半组多一行,此时取Half=2的最小值更接近中位数;若需精确中位数,优先使用PERCENTILE_CONT。
二、PERCENTILE_CONT() 实现(精确中位数)
原代码存在以下问题:
- PARTITION BY字段错误,应按
ID, [Month], Section分组而非Section, BestTime - 语法错误,多了一个冗余的右括号
修正后的代码:
SELECT DISTINCT ID, [Month], Section, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BestTime) OVER(PARTITION BY ID, [Month], Section) AS Median FROM MonthlyCycleTime SK
说明:PERCENTILE_CONT(0.5)会返回分组内的精确中位数(偶数行时取中间两数的平均值),通过DISTINCT去重后得到每个分组的唯一结果。
内容的提问来源于stack exchange,提问作者KH19
相关产品推荐
相关产品推荐

