You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑解释

  1. 子查询生成唯一标识:我们先给表中每条记录生成一个唯一的row_id(行号),这个标识用来确保那些不需要去重的记录(ID或IDEK为空)每条都能单独成为一个分组。
  2. 条件分组判断:
    • 如果ID和IDEK都不为空,就用CONCAT(id, '-', idek)作为分组键,相同的ID+IDEK组合会被分到同一组,实现去重。
    • 如果任一字段为空,就用row_id作为分组键,因为每条记录的row_id都是唯一的,所以这些记录会各自成为独立分组,保留所有重复项。
  3. 最终结果:分组后选择id和idek,就能得到你期望的结果。

验证示例数据

用你给出的测试数据执行上面的SQL,会得到以下结果:

IDIDEK
1null
null1
null1
nullnull
66522

完全符合你的预期!

内容的提问来源于stack exchange,提问作者Pavel K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:25:58