SQL中计算新增过滤条件后计数占基准计数比例的简便方法
优化实现方案
你可以通过单表扫描+条件聚合的方式实现需求,完全不需要两次查询同表再做关联,性能和代码简洁度都高很多。
通用兼容版本(支持所有主流SQL数据库)
SELECT SUM(CASE WHEN criteria3 = 'x' THEN 1 ELSE 0 END) * 1.0 / COUNT(*) AS 满足三个条件占比 FROM somewhere WHERE criteria1 = 'xxx' AND criteria2 = 'xx'
简洁版本(支持FILTER语法的数据库可用,如PostgreSQL、BigQuery等)
SELECT COUNT(*) FILTER (WHERE criteria3 = 'x') * 1.0 / COUNT(*) AS 满足三个条件占比 FROM somewhere WHERE criteria1 = 'xxx' AND criteria2 = 'xx'
说明
- 逻辑说明:
WHERE条件先过滤出满足前两个规则的所有数据,之后通过聚合函数直接分别统计符合第三个规则的行数、总行数,直接计算占比 - 注意代码中的
*1.0是为了避免整数除法问题:大部分数据库中整数除以整数会直接截断得到整数结果,乘以1.0转为浮点型计算可以得到准确的小数占比,你也可以根据你使用的数据库替换为显式类型转换语法(如CAST(字段 AS FLOAT)) - 相比原写法优势:仅需一次全表扫描,数据量越大性能优势越明显;没有冗余的重复过滤条件和无意义的自连接,代码更易维护
内容的提问来源于stack exchange,提问作者Soraqil
相关产品推荐
相关产品推荐

