新手SQL求助:用多行函数筛选FName_LVL1与LName_LVL1重复数据
解决SQL中筛选重复姓名组合的需求
嘿,刚接触SQL不用慌,这个找重复组合的需求其实很常见,咱们用两种实用的方法来搞定:
方法一:子查询关联法
这种方法兼容性拉满,几乎所有SQL数据库都支持。思路是先揪出重复的FName_LVL1 + LName_LVL1组合,再把原表和这些组合关联,就能拿到所有属于重复组合的行:
-- 记得把your_table替换成你的实际表名 SELECT t.* FROM your_table t INNER JOIN ( -- 先找出出现次数超过1次的姓名组合 SELECT FName_LVL1, LName_LVL1 FROM your_table GROUP BY FName_LVL1, LName_LVL1 HAVING COUNT(*) > 1 ) dup ON t.FName_LVL1 = dup.FName_LVL1 AND t.LName_LVL1 = dup.LName_LVL1 ORDER BY t.id;
方法二:窗口函数法(更简洁直观)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server这些),这个写法更清爽——直接给每行标记它所属组合的总行数,再筛选出重复的就行:
-- 替换your_table为你的实际表名 SELECT id, FName_LVL1, LName_LVL1, FName_LVL2, LName_LVL2 FROM ( SELECT *, -- 按姓名组合分组,计算每组的总记录数 COUNT(*) OVER (PARTITION BY FName_LVL1, LName_LVL1) AS group_count FROM your_table ) t -- 只保留组内记录数大于1的条目 WHERE group_count > 1 ORDER BY id;
用你给的示例数据测试的话,两种方法都会返回以下结果:
| id | FName_LVL1 | LName_LVL1 | FName_LVL2 | LName_LVL2 |
|---|---|---|---|---|
| 1 | John | Kennedy | Marc | Guy |
| 2 | John | Kennedy | Olivier | Oslo |
完全符合你“仅保留该组合重复条目”的需求~
内容的提问来源于stack exchange,提问作者Solide
相关产品推荐
相关产品推荐

