SQL查询中如何合并SELECT结果里指定列值重复的记录?
这个需求完全可以通过SQL实现,以下是两种常用实现方案:
方案1:窗口函数方案(推荐,适配MySQL 8.0+、PostgreSQL、SQL Server等所有支持标准窗口函数的数据库)
该方案后续扩展取最新记录的需求非常方便,只需要调整窗口排序规则即可。
SELECT post_id, author_name, title, content FROM ( SELECT posts.id as post_id, users.name as author_name, posts.title, posts.content, -- 按用户、标题、内容分组,组内按id排序,后续要取最新把id改为时间戳字段倒序即可 ROW_NUMBER() OVER (PARTITION BY posts.user_id, posts.title, posts.content ORDER BY posts.id ASC) AS rn FROM posts INNER JOIN users ON posts.user_id = users.id ) t WHERE rn = 1;
逻辑说明:PARTITION BY 会将用户ID、标题、内容三者完全一致的记录归为同一组,每组内按规则排序后取第一条,就实现了重复记录去重的需求。
方案2:分组聚合方案(兼容低版本数据库,如MySQL 5.x)
如果使用的数据库不支持窗口函数,可以通过分组聚合的方式实现,重复组内默认取最小/最大的帖子ID:
SELECT MIN(posts.id) as post_id, -- 要取最大ID改为MAX即可 users.name as author_name, posts.title, posts.content FROM posts INNER JOIN users ON posts.user_id = users.id GROUP BY posts.user_id, posts.title, posts.content, users.name;
两种方案执行后都能得到你期望的结果集。
内容的提问来源于stack exchange,提问作者Timothy Fisher
相关产品推荐
相关产品推荐

