繁体   English   中英

通过Postgresql计算正确的汇率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM