SQL查询按StartFrame列去重:GROUP BY后仍有重复行的解决方法
问题原因
你当前使用的GROUP BY StartFrame写法不符合标准SQL规范:SELECT子句中出现了大量未加入GROUP BY列表、也没有被聚合函数包裹的字段,仅在低版本MySQL等非标准配置的环境下才能执行,无法实现你要的去重效果。
解决方案
方案1:剔除完全重复的整行
如果重复行的所有字段取值完全一致,直接用DISTINCT关键字去重即可:
SELECT DISTINCT LabelingTasks.SessionID, LabelingFiles.LabelingFileID, LabelingFiles.Link, LabelingTasks.TaskTypeID, LabelingTasks.StartFrame, LabelingTasks.EndFrame, LabelingTasks.DataMarkingTypeID FROM LabelingTasks INNER JOIN LabelingFiles ON LabelingTaskID = LabelingFiles.LabelingTaskID WHERE LabelingTasks.MovieID = 10832 AND LabelingTasks.DataMarkingTypeID = 5 AND LabelingTasks.TaskTypeID = 4 ORDER BY StartFrame ASC
方案2:按StartFrame分组去重(每个StartFrame仅保留1行)
如果即使其他字段有差异,只要StartFrame相同就只保留一条记录,可使用窗口函数实现(支持MySQL 8.0+、PostgreSQL、SQL Server等主流数据库):
SELECT SessionID, LabelingFileID, Link, TaskTypeID, StartFrame, EndFrame, DataMarkingTypeID FROM ( SELECT LabelingTasks.SessionID, LabelingFiles.LabelingFileID, LabelingFiles.Link, LabelingTasks.TaskTypeID, LabelingTasks.StartFrame, LabelingTasks.EndFrame, LabelingTasks.DataMarkingTypeID, ROW_NUMBER() OVER (PARTITION BY StartFrame ORDER BY StartFrame) AS rn FROM LabelingTasks INNER JOIN LabelingFiles ON LabelingTaskID = LabelingFiles.LabelingTaskID WHERE LabelingTasks.MovieID = 10832 AND LabelingTasks.DataMarkingTypeID = 5 AND LabelingTasks.TaskTypeID = 4 ) t WHERE rn = 1 ORDER BY StartFrame ASC
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

