SQL技术问询:如何选取ID相同且其余所有列值均一致的行
选取ID相同且所有其他列值一致的行的解决方案
数据库SQL实现
方法1:GROUP BY + HAVING 关联原表
适用于所有支持基础SQL语法的数据库,核心逻辑是先定位重复的ID+列组合,再关联原表提取完整行:
-- 替换your_table为表名,col1~col20为其余20个列名 SELECT t.* FROM your_table t JOIN ( SELECT id, col1, col2, ..., col20 FROM your_table GROUP BY id, col1, col2, ..., col20 HAVING COUNT(*) > 1 ) dup ON t.id = dup.id AND t.col1 = dup.col1 AND t.col2 = dup.col2 -- 依次补全剩下的列匹配条件 AND t.col20 = dup.col20 ORDER BY t.id;
方法2:窗口函数(推荐,写法更简洁)
适用于支持窗口函数的数据库(如MySQL 8.0+、PostgreSQL、SQL Server),直接为每行标记重复次数,筛选出重复行:
SELECT * FROM ( SELECT *, COUNT(*) OVER (PARTITION BY id, col1, col2, ..., col20) AS dup_count FROM your_table ) t WHERE dup_count > 1 ORDER BY id;
进阶技巧:自动生成列名(避免手动写20列)
如果列数多不想逐个输入,可借助数据库系统表生成列名,以MySQL为例:
-- 替换your_database和your_table为实际库名、表名 SELECT GROUP_CONCAT(DISTINCT column_name SEPARATOR ', ') FROM information_schema.columns WHERE table_schema = 'your_database' AND table_name = 'your_table' AND column_name != 'id';
执行后复制结果,直接替换SQL中的col1, col2, ..., col20即可。
Python Pandas实现
如果用Python处理数据,可通过pandas的duplicated函数快速筛选:
import pandas as pd # 读取数据,替换为你的数据源路径 df = pd.read_csv('your_data.csv') # 定义需要检查重复的列:ID + 其余20列 check_cols = ['id'] + [f'col{i}' for i in range(1, 21)] # 获取所有重复行(keep=False会标记所有重复项,而非仅标记后续重复行) duplicate_rows = df[df.duplicated(subset=check_cols, keep=False)] # 输出或保存结果 print(duplicate_rows) # duplicate_rows.to_csv('duplicate_results.csv', index=False)
内容的提问来源于stack exchange,提问作者Lengus
相关产品推荐
相关产品推荐

