SQL实现:同一ID含两类记录时用CASE WHEN生成第三类分组
实现方法
这个需求很典型,就是要对同一ID下的多类型记录做统一标记,我给你两种常用的SQL实现方案,分别适配查询和更新场景:
方案1:查询生成结果(不修改原表)
如果只是需要输出处理后的结果,不想改动原数据,用窗口函数是最简洁的方式:
SELECT ID, CASE -- 统计当前ID下有多少种不同的Type,等于2说明同时存在LD和A WHEN COUNT(DISTINCT Type) OVER (PARTITION BY ID) = 2 THEN 'LD_A' -- 否则保留原Type ELSE Type END AS Type FROM your_table;
说明:PARTITION BY ID会把数据按ID分组,窗口函数COUNT(DISTINCT Type)计算每组内的不同类型数量,判断为2时就返回LD_A,刚好满足你要的保留行数且统一标记的需求。
方案2:直接更新原表
如果需要修改原表中的数据,不同数据库的语法略有差异,这里给出通用的关联更新写法:
MySQL 版本
UPDATE your_table t1 -- 子查询找出所有同时包含LD和A的ID JOIN ( SELECT ID FROM your_table GROUP BY ID HAVING COUNT(DISTINCT Type) = 2 ) t2 ON t1.ID = t2.ID SET t1.Type = 'LD_A';
PostgreSQL 版本
UPDATE your_table SET Type = 'LD_A' WHERE ID IN ( SELECT ID FROM your_table GROUP BY ID HAVING COUNT(DISTINCT Type) = 2 );
说明:先通过子查询筛选出符合条件的ID集合,再把这些ID对应的所有记录的Type字段更新为LD_A,其他ID的记录不受影响。
内容的提问来源于stack exchange,提问作者HM8689
相关产品推荐
相关产品推荐

