如何用GROUP BY过滤title大小写重复行并保留全列数据
处理title大小写重复并保留任意一行全列数据
要解决title大小写差异导致的重复数据问题,同时保留所有列的数据,推荐用窗口函数(适合主流数据库新版本)或子查询关联(兼容旧版本数据库)的方案,以下是具体实现:
方案1:窗口函数(MySQL 8.0+/PostgreSQL/SQL Server等支持窗口函数的数据库)
利用ROW_NUMBER()给每个小写title相同的分组分配行号,取每组第一行即可:
SELECT key_id, account_id, title, bpic, description, legal, address FROM ( SELECT *, -- 按小写title分组,每组内按key_id排序(可换成其他字段控制保留哪一行) ROW_NUMBER() OVER (PARTITION BY LOWER(title) ORDER BY key_id) AS row_num FROM your_table_name ) grouped_data WHERE row_num = 1;
- 说明:
PARTITION BY LOWER(title)将大小写不同但内容一致的title归为同一组;ORDER BY key_id指定每组内取key_id最小的行,若想随机保留任意一行,可换成ORDER BY RAND()(注意大数据量下性能会受影响)。
方案2:子查询关联(兼容MySQL 5.x等无窗口函数的数据库)
先分组获取每组小写title对应的唯一key_id,再关联原表拿到全列数据:
SELECT t1.* FROM your_table_name t1 INNER JOIN ( -- 按小写title分组,取每组最小的key_id(也可用MAX(key_id)) SELECT MIN(key_id) AS target_key_id FROM your_table_name GROUP BY LOWER(title) ) t2 ON t1.key_id = t2.target_key_id;
- 说明:此方法通过
MIN(key_id)锁定每组要保留的行,确保最终结果无重复,且能拿到所有列的数据。
内容的提问来源于stack exchange,提问作者Andrei Gaina
相关产品推荐
相关产品推荐

