我想计算这个简单的xy_table
中y
的中位数,并且要按照子组进行计算:
x | y --groups--> gid | x | y --medians--> gid | x | y
------- ------------- -------------
0.1 | 4 0.0 | 0.1 | 4 0.0 | 0.1 | 4
0.2 | 3 0.0 | 0.2 | 3 | |
0.7 | 5 1.0 | 0.7 | 5 1.0 | 0.7 | 5
1.5 | 1 2.0 | 1.5 | 1 | |
1.9 | 6 2.0 | 1.9 | 6 | |
2.1 | 5 2.0 | 2.1 | 5 2.0 | 2.1 | 5
2.7 | 1 3.0 | 2.7 | 1 3.0 | 2.7 | 1
在这个例子中,每个
x
都是唯一的,表已经按x
排序。
现在我想要通过GROUP BY round(x)
来分组,并获取每个组中y
的中位数元组。
我已经可以使用这个排名查询计算整个表的中位数:SELECT a.x, a.y FROM xy_table a,xy_table b
WHERE a.y >= b.y
GROUP BY a.x, a.y
HAVING count(*) = (SELECT round((count(*)+1)/2) FROM xy_table)
输出:0.1,4.0
但我还没有成功编写查询来计算子组的中位数。
注意:我没有可用的median()
聚合函数。请不要提出带有特殊PARTITION
、RANK
或 QUANTILE
语句的解决方案(如在类似但过于特定于供应商的SO问题中找到的)。我需要纯SQL(即与SQLite兼容且没有median()
函数)
gid
改为了 0.1,而且x
和y
值都不是 0.0 组的中位数。 - Aprilliongid
(组ID)组的中位数。在这种情况下,我假设[4,3]的中位数是4(较大的值)。 - Juve