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

当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,否则为0
  • MAX(...):在分组后的结果中,只要该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,否则返回NULL
  • COUNT(DISTINCT...):计数时会忽略NULL值,且因为是同一个id,所以最多统计1次,刚好符合“存在即1,不存在即0”的需求

验证结果

用你的源表数据测试以上SQL,都会得到完全符合目标表的结果:

idlabelaction_Aaction_B
1aaaaa11
2aaaaa01

内容的提问来源于stack exchange,提问作者Norah Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:47:54