【发布时间】:2013-04-03 12:26:06
【问题描述】:
我想在这个简单的xy_table 的子组 中计算y 的Median:
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 questions 中找到)提出解决方案。我需要普通的 SQL(即兼容没有 median() 函数的 SQLite)
【问题讨论】:
-
在您的示例中,第 2 表和第 3 表之间的关系是什么?第一个
gid更改为 0.1,x和y值都不是 0.0 组的中位数 -
对不起,我有一个错字。第三张表应显示
gid(组 ID)组的中位数。在这种情况下,我假设 [4,3] 的中位数为 4(较大的值)。 -
[4,3] 的中值通常是 3.5,如您的 wikipedia 链接第一段中所建议的,您是否明确想要获得更大的值?
-
是的,我想要更大的。查询应该只选择现有记录而不引入新记录。很抱歉称其为“中位数”。 :) 我目前正在处理您的查询,到目前为止看起来不错。我刚刚删除了 left_row/right_row 的东西和 avg,因为我不需要。
标签: sql sqlite group-by ranking median