You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中选取前5条记录并合并分组其余记录

需求说明

我有一张包含NAME和COUNT两列的数据表,原始数据如下:

NAMECOUNT
a12
a24
a35
a41
a56
a62
a74
a86
a97
a104
a111

需要实现两个目标:

  • 提取表中的前5条记录
  • 把剩下的所有记录合并成一条,命名为others,这条记录的COUNT值是剩余所有记录的COUNT总和

最终期望得到的结果如下:

NAMECOUNT
a12
a24
a35
a41
a56
others24

实现方案

可以通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:03:35