gpt4 book ai didi

sql - 如何找到分组的 SQL 中位数

转载 作者:行者123 更新时间:2023-12-04 18:22:13 46 4
gpt4 key购买 nike

我正在使用 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

请问如何通过代码列找到中位数 AND 组?
要获得这样的结果集:
Code   Median
-----------------------
4 240
2 16.5
6 30

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

最佳答案

当每个组中有奇数个成员时,使用 rank 的解决方案效果很好,即样本中存在中位数,如果成员数为偶数,则 rank 方法会下降,例如

1
2
3
4

这里的中位数是 2.5(即一半的组较小,一半的组较大)但 rank 方法将返回 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;

Example on SQL Fiddle

在 SQL Server 2012 中,您可以使用 PERCENTILE_CONT
SELECT  DISTINCT
Code,
Median = PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Value) OVER(PARTITION BY Code)
FROM T;

Example on SQL Fiddle

关于sql - 如何找到分组的 SQL 中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566513/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com