MySQL:仅当双字段非空时用GROUP BY去重,空值记录保留
实现MySQL条件化GROUP BY去重:仅当ID和IDEK均非空时去重
没问题,我来帮你搞定这个定制化的去重需求!你想要的是只有当ID和IDEK两个字段都不为空时才执行去重,只要其中一个字段为空,就保留所有该类的重复记录,普通的GROUP BY id, idek做不到这点,因为它会把所有NULL值的记录也合并分组,我们需要用条件分组来实现。
解决方案SQL
SELECT id, idek FROM ( SELECT id, idek, -- 给每条记录生成唯一行号,用于区分需要保留重复的记录 ROW_NUMBER() OVER () AS row_id FROM test ) temp GROUP BY -- 条件分组键:仅当ID和IDEK都非空时,用两者的组合作为分组键;否则用唯一行号 CASE WHEN id IS NOT NULL AND idek IS NOT NULL THEN CONCAT(id, '-', idek) ELSE row_id END, id, idek;
逻辑解释
- 子查询生成唯一标识:我们先给表中每条记录生成一个唯一的
row_id(行号),这个标识用来确保那些不需要去重的记录(ID或IDEK为空)每条都能单独成为一个分组。 - 条件分组判断:
- 如果
ID和IDEK都不为空,就用CONCAT(id, '-', idek)作为分组键,相同的ID+IDEK组合会被分到同一组,实现去重。 - 如果任一字段为空,就用
row_id作为分组键,因为每条记录的row_id都是唯一的,所以这些记录会各自成为独立分组,保留所有重复项。
- 如果
- 最终结果:分组后选择
id和idek,就能得到你期望的结果。
验证示例数据
用你给出的测试数据执行上面的SQL,会得到以下结果:
| ID | IDEK |
|---|---|
| 1 | null |
| null | 1 |
| null | 1 |
| null | null |
| 665 | 22 |
完全符合你的预期!
内容的提问来源于stack exchange,提问作者Pavel K
相关产品推荐
相关产品推荐

