SQL如何按ID分组统计Transport列唯一值 避免Product导致重复计数
问题解决方案
核心处理逻辑分两步,从根源规避多Product关联导致的Transport重复计数问题:
- 先对
ID和Transport字段做组合去重,同一个ID下不管多少个Product关联同一个Transport,都只保留1条有效记录 - 基于去重后的结果做条件聚合,直接判断对应Transport是否存在,标记1/0即可,无需做count计数
通用SQL实现(兼容所有支持SQL92标准的数据库,包括MySQL、PostgreSQL、SQL Server、Oracle等)
SELECT ID, MAX(CASE WHEN Transport = 'Plane' THEN 1 ELSE 0 END) AS Plane, MAX(CASE WHEN Transport = 'Train' THEN 1 ELSE 0 END) AS Train, MAX(CASE WHEN Transport = 'Ship' THEN 1 ELSE 0 END) AS Ship FROM ( -- 子查询完成ID+Transport维度去重,消除Product关联带来的重复数据 SELECT DISTINCT ID, Transport FROM 替换成你的实际表名 ) AS dedup_transport GROUP BY ID;
逻辑说明
- 子查询的
DISTINCT ID, Transport会直接过滤冗余重复数据:比如ID=1下Product A、B都对应Plane,子查询只会保留1条(1, 'Plane')记录,从数据源层面避免重复 - 外层聚合用
MAX()而非COUNT():只要去重结果中存在对应Transport的记录,CASE判断返回的1就会被MAX取到,不存在则返回0,完全不会出现计数翻倍的问题 - 运行结果和预期完全匹配:
- ID=1:Plane=1、Train=0、Ship=0
- ID=2:Plane=0、Train=1、Ship=1
- ID=3:Plane=1、Train=1、Ship=1
如果后续Transport枚举值有新增,只需要在外层SELECT里新增对应的CASE判断行即可,不需要调整核心去重逻辑。
内容的提问来源于stack exchange,提问作者indie_cloud
相关产品推荐
相关产品推荐

