如何在SQL中选取前5条记录并合并分组其余记录
需求说明
我有一张包含NAME和COUNT两列的数据表,原始数据如下:
| NAME | COUNT |
|---|---|
| a1 | 2 |
| a2 | 4 |
| a3 | 5 |
| a4 | 1 |
| a5 | 6 |
| a6 | 2 |
| a7 | 4 |
| a8 | 6 |
| a9 | 7 |
| a10 | 4 |
| a11 | 1 |
需要实现两个目标:
- 提取表中的前5条记录
- 把剩下的所有记录合并成一条,命名为
others,这条记录的COUNT值是剩余所有记录的COUNT总和
最终期望得到的结果如下:
| NAME | COUNT |
|---|---|
| a1 | 2 |
| a2 | 4 |
| a3 | 5 |
| a4 | 1 |
| a5 | 6 |
| others | 24 |
实现方案
可以通过UNION ALL将前5条记录和汇总后的others记录拼接起来,下面是不同场景下的SQL写法:
通用基础写法
这个写法适用于大多数支持标准SQL的数据库:
-- 获取前5条记录 SELECT NAME, COUNT FROM your_table LIMIT 5 UNION ALL -- 汇总剩余记录为others SELECT 'others' AS NAME, SUM(COUNT) AS COUNT FROM ( -- 取前5条之后的所有记录 SELECT COUNT FROM your_table LIMIT (SELECT COUNT(*) FROM your_table) - 5 OFFSET 5 ) AS remaining_data;
带窗口函数的优化写法(MySQL 8+/PostgreSQL等)
如果数据库支持窗口函数,可以先给每条记录编号,再筛选和汇总,逻辑更清晰:
WITH numbered_data AS ( SELECT NAME, COUNT, ROW_NUMBER() OVER () AS row_id -- 按原始顺序编号,如需排序可加ORDER BY,比如ORDER BY COUNT DESC FROM your_table ) -- 取前5条 SELECT NAME, COUNT FROM numbered_data WHERE row_id <= 5 UNION ALL -- 汇总剩余记录 SELECT 'others' AS NAME, SUM(COUNT) AS COUNT FROM numbered_data WHERE row_id > 5;
PostgreSQL简化写法
PostgreSQL支持直接对OFFSET后的结果做汇总,无需子查询:
SELECT NAME, COUNT FROM your_table LIMIT 5 UNION ALL SELECT 'others', SUM(COUNT) FROM your_table OFFSET 5;
注意:如果需要按特定顺序选取前5条(比如按COUNT从大到小排序),要在ROW_NUMBER()的OVER()里或者SELECT语句中添加ORDER BY子句,比如ORDER BY COUNT DESC。
内容的提问来源于stack exchange,提问作者Abhishek Bansal
相关产品推荐
相关产品推荐

