当value_2、value_3为特定值时计算distinct value_1,实现ID透视统计
解决方案:特定条件下唯一ID的行转列统计
这是一个典型的**行转列(Pivot)**需求,核心是对每个id和label,判断其是否存在特定action的记录,并将结果以列的形式展示(存在记1,不存在记0),同时自动处理重复记录的去重问题。
方法1:使用MAX(CASE...)实现(推荐)
这种方法逻辑直观,利用分组后的聚合函数判断是否存在符合条件的记录:
SELECT id, label, -- 判断当前id是否有action='A'的记录,有则返回1,否则0 MAX(CASE WHEN action = 'A' THEN 1 ELSE 0 END) AS action_A, -- 判断当前id是否有action='B'的记录,有则返回1,否则0 MAX(CASE WHEN action = 'B' THEN 1 ELSE 0 END) AS action_B FROM people -- 按id和label分组,确保每个id+label组合只生成一行结果 GROUP BY id, label;
逻辑解释:
CASE WHEN action = 'A' THEN 1 ELSE 0 END:对每一行数据,若action是'A'则标记为1,否则为0MAX(...):在分组后的结果中,只要该id存在至少一条'A'的记录,MAX就会保留1;如果没有,就保留0,自动实现了去重统计的效果
方法2:使用COUNT(DISTINCT...)实现
如果你更习惯用计数函数,也可以用这种方式:
SELECT id, label, -- 统计当前id下action='A'的唯一id数量(存在则为1,不存在则为0) COUNT(DISTINCT CASE WHEN action = 'A' THEN id END) AS action_A, COUNT(DISTINCT CASE WHEN action = 'B' THEN id END) AS action_B FROM people GROUP BY id, label;
逻辑解释:
CASE WHEN action = 'A' THEN id END:仅当action是'A'时返回当前id,否则返回NULLCOUNT(DISTINCT...):计数时会忽略NULL值,且因为是同一个id,所以最多统计1次,刚好符合“存在即1,不存在即0”的需求
验证结果
用你的源表数据测试以上SQL,都会得到完全符合目标表的结果:
| id | label | action_A | action_B |
|---|---|---|---|
| 1 | aaaaa | 1 | 1 |
| 2 | aaaaa | 0 | 1 |
内容的提问来源于stack exchange,提问作者Norah Jones
相关产品推荐
相关产品推荐

