我有一个包含类似于下面的数据集的表。有数千个条目具有组ID和金额。
+-------+--------+
| Group | amount |
+-------+--------+
| 1 | 10 |
| 1 | 15 |
| 1 | 11 |
| 1 | 5 |
| 1 | 100 |
| 2 | 200 |
| 2 | 8 |
| 2 | 12 |
| 2 | 23 |
| 2 | 40 |
| 2 | 40 |
| 2 | 40 |
| 3 | 3 |
| 3 | 3 |
+-------+--------+
对于每个组,我需要组中最高金额的前三个条目的(舍入)平均值。如果该组的条目少于三个,则平均值基于可用条目。
潜在的表可能看起来像,例如组#1:(100 + 15 + 11)/ 3 = 42:
+-------+--------+
| Group | amount |
+-------+--------+
| 1 | 42 |
| 2 | 92 |
| 3 | 3 |
+-------+--------+
每个组可以有1个或多个条目,金额是正整数,但它们可以具有相同的值。
我已经玩过Group by by order by但它似乎没有做对。任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
大多数数据库都支持ANSI标准row_number()
功能,可以帮助您解决此问题。这样的东西可以在大多数数据库中使用:
select `group`, cast(0.5 + avg(amount) as int) as RoundedAverage
from (select t.*,
row_number() over (group by "group" order by amount desc) as seqnum
from t
) t
where seqnum <= 3
group by `group`;
如果您的数据库中没有row_number()
,您可以使用子查询或其他方式进行工作,尽管id
列可用于此目的。