SQL获取每个组的前3个条目

时间:2014-03-04 16:17:08

标签: sql group-by sql-order-by

我有一个包含类似于下面的数据集的表。有数千个条目具有组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但它似乎没有做对。任何帮助表示赞赏。感谢。

1 个答案:

答案 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列可用于此目的。