如何查找分组的SQL中位数

Stu*_*per 2 sql t-sql sql-server group-by median

我正在使用SQL Server 2008

如果我有这样的表:

Code   Value
-----------------------
4      240
4      299
4      210
2      NULL
2      3
6      30
6      80
6      10
4      240
2      30
Run Code Online (Sandbox Code Playgroud)

如何通过Code列找到中位数AND组?要获得这样的结果集:

Code   Median
-----------------------
4      240
2      16.5
6      30
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢这个中位数的解决方案,但不幸的是它不包括Group By:https: //stackoverflow.com/a/2026609/106227

Gar*_*thD 6

当你在每个组中有一个奇数个成员时,使用rank的解决方案可以很好地工作,即样本中存在中位数,其中你有一个偶数个成员,秩方法将会下降,例如

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

这里的中位数是2.5(即组的一半较小,一半组较大),但排名方法将返回3.为了解决这个问题,您基本上需要从组的下半部分取最高值,并且组的上半部分的底部值,并取两个值的平均值.

WITH CTE AS
(   SELECT  Code,
            Value, 
            [half1] = NTILE(2) OVER(PARTITION BY Code ORDER BY Value), 
            [half2] = NTILE(2) OVER(PARTITION BY Code ORDER BY Value DESC)
    FROM    T
    WHERE   Value IS NOT NULL
)
SELECT  Code,
        (MAX(CASE WHEN Half1 = 1 THEN Value END) + 
        MIN(CASE WHEN Half2 = 1 THEN Value END)) / 2.0
FROM    CTE
GROUP BY Code;
Run Code Online (Sandbox Code Playgroud)

关于SQL小提琴的例子


在SQL Server 2012中,您可以使用PERCENTILE_CONT

SELECT  DISTINCT
        Code,
        Median = PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Value) OVER(PARTITION BY Code)
FROM    T;
Run Code Online (Sandbox Code Playgroud)

关于SQL小提琴的例子