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
当你在每个组中有一个奇数个成员时,使用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 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)
归档时间: |
|
查看次数: |
4964 次 |
最近记录: |