PostgreSQL中如何用单条SQL计算用户72小时内首次活跃占比?
单条PostgreSQL语句计算创建后72小时内首次活跃的用户占比
当然可以用单条SQL实现这个需求,不用分开查询再手动计算。下面是几种实用的实现方式:
方式一:使用CASE表达式统计符合条件的用户
SELECT COUNT(CASE WHEN first_active <= created_at + INTERVAL '72 hour' THEN 1 END)::FLOAT / COUNT(*) AS active_within_72h_ratio FROM users;
- 逻辑说明:
CASE表达式仅对满足条件的用户返回1,其余返回NULL;COUNT()会自动忽略NULL值,因此得到的是符合"72小时内首次活跃"的用户数。 - 加上
::FLOAT是为了将整数转为浮点数,避免PostgreSQL默认的整数除法(整数相除会直接截断小数部分,导致结果只能是0或1)。
方式二:使用PostgreSQL专属的FILTER子句(可读性更强)
SELECT COUNT(*) FILTER (WHERE first_active <= created_at + INTERVAL '72 hour')::FLOAT / COUNT(*) AS active_within_72h_ratio FROM users;
FILTER是PostgreSQL的扩展语法,专门用于筛选聚合函数的计算范围,写法更直观易懂。
可选:格式化结果保留指定小数位数
如果需要将占比结果格式化(比如保留两位小数),可以搭配ROUND函数:
SELECT ROUND( COUNT(*) FILTER (WHERE first_active <= created_at + INTERVAL '72 hour')::FLOAT / COUNT(*), 2 ) AS active_within_72h_ratio FROM users;
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

