如何DRY化PostgreSQL中计算任务完成率的查询语句?
如何DRY化计算特定日期范围任务完成率的SQL查询?
你可以通过单次扫描目标数据、在同一查询中完成完成数和总数的统计来实现DRY,避免重复编写WHERE条件,无需使用临时视图。以下是两种简洁的实现方式:
方法1:使用CASE表达式聚合统计
SELECT SUM(CASE WHEN completed = true THEN 1 ELSE 0 END)::FLOAT / COUNT(*) AS completion_rate FROM tasks WHERE created_at > CURRENT_DATE - INTERVAL '15 day' AND created_at < CURRENT_DATE - INTERVAL '5 day';
- 仅执行一次WHERE条件过滤,避免重复逻辑
SUM(CASE...)精准统计已完成的任务数量- 转换为FLOAT类型是为了避免整数除法导致结果被截断(不同数据库类型转换语法可能略有差异,比如MySQL可改用
CAST(...) AS DECIMAL(5,2))
方法2:利用布尔值的数值特性直接计算平均值
多数SQL数据库会将布尔值true视为1、false视为0,因此可以直接用AVG函数计算完成率:
SELECT AVG(completed::FLOAT) AS completion_rate FROM tasks WHERE created_at > CURRENT_DATE - INTERVAL '15 day' AND created_at < CURRENT_DATE - INTERVAL '5 day';
- 逻辑更简洁,
AVG(completed)本质就是已完成任务数除以总任务数 - 同样需要转换数值类型以确保得到小数形式的占比
内容的提问来源于stack exchange,提问作者Peter Nixey
相关产品推荐
相关产品推荐

