[英]Calculate correct rate via postgresql
这是表格result
的数据:
question_id is_correct count
64 TRUE 11
66 FALSE 20
77 FALSE 15
77 TRUE 9
我需要计算正确的比率,等于(TRUE_COUNT)/(TRUE_COUNT+FALSE_COUNT)
。 现在的问题是某些问题缺少TRUE或FALSE数据,我想用零填充它以便进行self join
运算和计算。 有什么办法可以满足要求或填零? 万分谢意!
预期结果:
question_id correct_rate
64 1
66 0
77 0.625
无需自我加入,您可以进行条件聚合:
select
question_id,
-- to return a percentage
100.0 *
max(case when is_correct = TRUE then count else 0 end) /
sum(count)
-- otherwise needs to add a cast if "count" is an INT
-- max(case when is_correct = TRUE then count else 0 end) /
-- cast(sum(count) as decimal(5,4))
from tab
group by question_id
条件聚合是正确的,但有一些细微差别:
SELECT
question_id
,SUM(CASE WHEN is_correct THEN count ELSE 0 END)
/(CASE WHEN SUM(count) < 1 THEN 1 ELSE SUM(count) END)::NUMERIC
FROM
result
GROUP BY
question_id
确保您不会被0除(如果是0/0),并且确保将其转换为小数或数字以得到所需的比率。
另请注意,您所希望的.625结果与77相对应的结果不正确,即为.375 9 true / 24
您完全不需要JOIN
。 请查看以下有关如何有条件地汇总数据的信息:
SELECT
question_id,
COALESCE(SUM(count) FILTER(WHERE is_correct),0) / SUM(count)::NUMERIC AS rate
FROM
result
GROUP BY
question_id;
-- Older version of PostgreSQL without FILTER:
SELECT
question_id,
COALESCE(SUM(CASE WHEN is_correct THEN count END),0) / SUM(count)::NUMERIC AS rate
FROM
result
GROUP BY
question_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.