如何编写SQL按版本分组统计is_success=0的记录占比
问题说明
假设存在如下数据表,样例数据如下:
version is_success(only 1 and 0) 0.1 0 0.1 0 0.1 1 0.1 1 0.2 0 0.2 0 0.2 0
需求为按version维度分组,计算每组中is_success=0的记录数占该组总记录数的比例,预期结果如下:
version count(is_success=0)/count(all based on is_success type) 0.1 2/4=0.5 0.2 3/3=1
实现方法
核心逻辑为分组后通过条件聚合统计is_success=0的行数,再除以分组内总记录数得到对应占比。
通用SQL写法
该写法符合SQL标准,适配PostgreSQL、Hive、SQL Server、MySQL等绝大多数数据库:
SELECT version, SUM(CASE WHEN is_success = 0 THEN 1 ELSE 0 END) / COUNT(*) AS fail_ratio FROM your_table GROUP BY version;
注意将
your_table替换为实际使用的表名即可。
数据库专属简化写法
- MySQL环境下布尔表达式返回值为1/0,可直接求和简化代码:
SELECT version, SUM(is_success = 0) / COUNT(*) AS fail_ratio FROM your_table GROUP BY version;
- 若存在分组无有效记录的场景,可增加除零保护逻辑,以MySQL为例:
SELECT version, IF(COUNT(*) = 0, 0, SUM(is_success = 0) / COUNT(*)) AS fail_ratio FROM your_table GROUP BY version;
执行对应SQL后即可得到预期的分组占比结果。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

