MySQL如何按日期分组将小计数数据合并为‘others’?
MySQL实现分组内低频项合并为'others'的方案
当然可行!这种把分组内小量级数据合并成统一的“others”条目来简化数据展示的需求,在MySQL里完全可以实现,而且用窗口函数就能很优雅地搞定。结合你的示例数据,我给你写个具体的实现方案:
核心思路
咱们的需求是按date分组,每个分组里保留count值最高的前2条记录,剩下的所有记录把count求和后合并成一条val='other'的记录。用窗口函数给每个分组内的记录按count排序,再分类处理就可以实现。
具体SQL代码
SELECT date, CASE WHEN rn <= 2 THEN val ELSE 'other' END AS val, SUM(count) AS count FROM ( -- 内层子查询:给每个date分组内的记录按count降序编号 SELECT date, val, count, ROW_NUMBER() OVER (PARTITION BY date ORDER BY count DESC) AS rn FROM your_table -- 这里替换成你的实际表名 ) t GROUP BY date, CASE WHEN rn <= 2 THEN val ELSE 'other' END ORDER BY date, count DESC;
代码解释
- 内层子查询:用
ROW_NUMBER() OVER (PARTITION BY date ORDER BY count DESC)给每个date分组里的记录排序编号——每个date下count最大的记录编号为1,次大的为2,以此类推。 - 外层聚合:通过
CASE判断,编号≤2的保留原val值,其余统一替换为other;再按date和处理后的val分组求和,就得到了你想要的结果。 - 灵活调整:如果之后需要每个date保留更多(比如前3条)或更少的记录,只需要把
rn <= 2改成对应的数字就行,非常方便。
验证结果
用你的示例数据运行这段SQL,得到的结果和你期望的完全一致:
date val count
2017-01-25 ua5 50
2017-01-25 ua6 49
2017-01-25 other 5
2017-02-25 ua8 35
2017-02-25 ua3 20
2017-02-25 other 2
内容的提问来源于stack exchange,提问作者hukachaka
相关产品推荐
相关产品推荐

