mysql - 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
中的amount
s,与total_items
. 这意味着在最初的 100 行中,只剩下 21 行。
我可以在单个查询中执行此操作吗?我正在考虑的方法是:
1) 选择 TOP 20 并存储在 #temp1 表中
2) 选择其余的并存储在 #temp2 表中
3) 选择#temp2 的总和amount
,total_items
使其变成一行
4)将两个结果合并在一起
当然,必须有更好、更有效的方法来做到这一点。
解决方案
您可以使用窗口函数:
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 组。
推荐阅读
- reactjs - 当我单击 React Semantic UI 搜索模块中的提示性项目时,如何重定向页面?
- node.js - 在 Express/Node Js 中验证基于微服务的 API 端点
- mysql - 当我想要相关资源的子集时避免“n+1 选择”问题
- c++ - cin.get() 导致“没有重载函数的实例”错误
- html - 如何让我的自托管字体工作?
- python - 为什么不能在 python 2 中将 print 分配给 foo?
- vba - 通过 VBA 宏关闭时延迟关闭 Powerpoint
- python - 如何在一个窗口中显示多个页面?
- c# - 为什么以及何时应该在 C# 继承期间使用“this”来访问基类中的方法?
- python - 如何从 sqlalchemy 的另一个目录中的模型类创建表?