按唯一分组统计各ID的不同布尔值,计算产品类别审批百分比
嘿,我来帮你搞定这两个SQL需求,分情况给你拆解清楚:
问题1:统计唯一分组中每个ID对应的不同布尔值数量
假设你的表结构包含类似group_id(分组标识)、account_id(目标ID)、is_valid(布尔值列)这类字段,要统计每个account_id在所属唯一分组里出现的不同布尔值数量,直接用分组聚合结合COUNT(DISTINCT)就能实现:
SELECT group_id, account_id, COUNT(DISTINCT is_valid) AS distinct_boolean_count FROM your_table GROUP BY group_id, account_id;
GROUP BY group_id, account_id确保我们是按「唯一分组+ID」的组合维度来统计COUNT(DISTINCT is_valid)会精准计算该组合下出现的不同布尔值种类数(比如同时存在true和false的话结果就是2,只有一种状态就是1)
问题2:新增产品类别下的审批百分比列
假设你已经能通过子查询得到每个account_id在对应产品类别下的审批状态(布尔值is_approved),现在要新增一列展示该类别整体的审批百分比,用窗口函数是最高效的方案,不用额外嵌套复杂子查询:
先给你一个完整的可复用示例,假设原表是product_accounts,包含category(产品类别)、account_id(账户ID),审批状态通过关联service_approvals表判断:
SELECT pa.category, pa.account_id, -- 这里替换成你实际的审批判断逻辑 EXISTS ( SELECT 1 FROM service_approvals sa WHERE sa.account_id = pa.account_id AND sa.service_type = 'target_service' ) AS is_approved, -- 计算当前类别下的审批百分比,保留两位小数 ROUND( SUM(CASE WHEN EXISTS ( SELECT 1 FROM service_approvals sa WHERE sa.account_id = pa.account_id AND sa.service_type = 'target_service' ) THEN 1 ELSE 0 END) OVER (PARTITION BY pa.category) / COUNT(*) OVER (PARTITION BY pa.category) * 100, 2 ) AS category_approval_percentage FROM product_accounts pa GROUP BY pa.category, pa.account_id;
如果觉得重复写审批子查询太啰嗦,用CTE(公共表达式)预处理一下,代码会更清爽:
WITH account_approval_status AS ( SELECT pa.category, pa.account_id, EXISTS ( SELECT 1 FROM service_approvals sa WHERE sa.account_id = pa.account_id AND sa.service_type = 'target_service' ) AS is_approved FROM product_accounts pa ) SELECT *, ROUND( SUM(CASE WHEN is_approved THEN 1 ELSE 0 END) OVER (PARTITION BY category) / COUNT(*) OVER (PARTITION BY category) * 100, 2 ) AS category_approval_percentage FROM account_approval_status;
PARTITION BY category把统计范围限定在当前产品类别内,不会跨类别计算SUM(CASE...)统计该类别下获批的账户总数,COUNT(*)统计类别总账户数,两者相除再转成百分比ROUND(...,2)是为了让百分比更美观,你可以根据需求调整保留的小数位数
内容的提问来源于stack exchange,提问作者MikeTaylor
相关产品推荐
相关产品推荐

