MySQL:GROUP BY分组时排除特定列值重复的行
解决时序数据GROUP BY时排除重复行的问题
没问题,这个需求完全可以实现,核心思路是先对「记录时间+位置+数值」完全相同的重复行去重,再按时间维度聚合求和。下面给你两种常用的SQL解决方案,适配大多数关系型数据库:
方法一:先用DISTINCT去重,再聚合
这种方法最直观,先通过子查询筛选出所有唯一的行组合,再外层按时间分组求和:
SELECT record_time, SUM(value) AS total_value FROM ( -- 子查询保留所有三列完全唯一的行 SELECT DISTINCT record_time, position, value FROM time_series_data ) AS unique_rows GROUP BY record_time;
针对你的示例数据,子查询会把重复的09:05:00 FRONT 100和09:05:00 BACK 25各保留一行,外层聚合后就能得到09:05:00 125的正确结果。
方法二:双层GROUP BY去重聚合
如果不想用DISTINCT,也可以通过两次分组来实现:内层先按「时间+位置+数值」分组(自动合并重复行),外层再按时间求和:
SELECT record_time, SUM(unique_value) AS total_value FROM ( -- 内层分组合并重复行,因为重复行的value相同,用MAX/AVG都可以 SELECT record_time, position, MAX(value) AS unique_value FROM time_series_data GROUP BY record_time, position, value ) AS unique_rows GROUP BY record_time;
这种方法和方法一的效果完全一致,适合习惯用分组逻辑处理去重的场景。
注意事项
- 如果你的重复行仅存在「记录时间+位置」相同,但数值可能不同的情况,那需要调整去重逻辑(比如保留最新的数值),但根据你的示例,当前的方案完全匹配需求。
- 不同数据库可能有一些语法细节差异,但核心逻辑通用(比如MySQL、PostgreSQL、SQL Server都支持上述写法)。
内容的提问来源于stack exchange,提问作者Aaron Glazer
相关产品推荐
相关产品推荐

