首页 > 解决方案 > MySQL ORDER BY TOP 20,然后将所有剩余结果汇总在一行中

问题描述

假设以下数据集:

item    |    amount    |    total_items

beer            5                10
beans           5                15

...ETC

假设有 100 个项目。我想SELECT TOP 20 ITEMS ORDER BY AMOUNT DESC。这将留下 80 个项目,我想将它们合并/聚合到一个item名为的单行"Other"中,它的amount列将是这 80 行SUM中的amounts,与total_items. 这意味着在最初的 100 行中,只剩下 21 行。

我可以在单个查询中执行此操作吗?我正在考虑的方法是:

1) 选择 TOP 20 并存储在 #temp1 表中

2) 选择其余的并存储在 #temp2 表中

3) 选择#temp2 的总和amounttotal_items使其变成一行

4)将两个结果合并在一起

当然,必须有更好、更有效的方法来做到这一点。

标签: mysqlsql

解决方案


您可以使用窗口函数:

select (case when seqnum <= 20 then item else 'rest' end) as item,
       sum(amount)
from (select it.*, row_number() over (order by amount desc) as seqnum
      from items i
     ) i
group by (case when seqnum <= 20 then item else 'rest' end) 
order by max(seqnum) desc;

这会根据金额(最高金额 = 1)为每一行分配一个序号。然后它聚合 20 个最高值,将其他所有值放入第 21 组。


推荐阅读