【问题标题】:SQL Get top 3 entries for each groupSQL 获取每个组的前 3 个条目
【发布时间】:2014-04-06 07:13:08
【问题描述】:

我有一个表,其中包含一个类似于下面的数据集。有数千个条目具有组 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 和 order by,但它似乎并不正确。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 你用的是什么数据库?

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


【解决方案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 列对此很有用。

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2022-12-07
    • 2023-03-16
    • 2023-02-23
    相关资源
    最近更新 更多