PostgreSQL同类子查询除法计算访问占比的简化实现方案
你可以使用PostgreSQL的条件聚合语法实现需求,仅需一次表扫描即可完成所有计算,没有冗余逻辑,代码可读性和执行效率都更高:
SELECT COUNT(*) FILTER (WHERE source = 'Netflix') * 100.0 / COUNT(*) AS visitors_percentage FROM visits.visitors_log WHERE (day AT TIME ZONE 'PST')::DATE = '2019-12-22';
逻辑说明
- 首先在
WHERE子句完成时区转换和日期过滤:先将day字段转换为PST时区,再筛选出日期为2019-12-22的所有记录,一步完成时区转换步骤,过滤后的结果集仅包含目标日的所有访问数据。 - 用
COUNT(*)直接统计目标日总访问量。 - 用
COUNT(*) FILTER (WHERE source = 'Netflix')带条件统计来源为Netflix的访问量,不需要额外嵌套子查询。 - 两个计数结果直接相除得到占比,乘以
100.0是为了避免整数除法得到错误结果。
如果你需要兼容不支持FILTER语法的低版本PostgreSQL,也可以用CASE表达式替代:
SELECT SUM(CASE WHEN source = 'Netflix' THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS visitors_percentage FROM visits.visitors_log WHERE (day AT TIME ZONE 'PST')::DATE = '2019-12-22';
内容的提问来源于stack exchange,提问作者alphaomega
相关产品推荐
相关产品推荐

