Postgres中没有子查询的总计算百分比

时间:2015-03-10 15:05:23

标签: sql postgresql aggregate-functions percentage

我试图创造一个"总百分比"列,当前使用的子查询没有问题:

SELECT ID, COUNT(*), COUNT(*) / (SELECT COUNT(*)
FROM DATA) AS % OF TOTAL FROM DATA GROUP BY ID;

|  ID  | COUNT | % OF TOTAL |
|  1   |  100  |    0.10    |
|  2   |  800  |    0.80    |
|  3   |  100  |    0.10    |

但是,出于这个问题范围之外的原因,我想看看是否有任何方法可以在不使用子查询的情况下完成此任务。本质上,应用程序使用SQL查询之外的逻辑来确定WHERE子句是什么,并将其注入查询。这个逻辑没有考虑到如上所述的子查询的存在,所以在返回并重建所有现有逻辑以解决这种情况之前,我想我是否会先找到另一个解决方案。 / p>

我尝试使用窗口功能来完成此效果,但无济于事。

2 个答案:

答案 0 :(得分:5)

使用窗口功能:

SELECT ID, COUNT(*),
       COUNT(*) / SUM(COUNT(*)) OVER () AS "% OF TOTAL"
FROM DATA
GROUP BY ID;

答案 1 :(得分:2)

SELECT id, count(*) AS ct
     , round(count(*)::numeric
           / sum(count(*)) OVER (ORDER BY id), 2) AS pct_of_running_total
FROM   data
GROUP  BY id;

必须 ORDER BY添加到窗口函数或行的顺序是任意的。起初我可能看起来很正确,但这可以随时改变,而且没有任何警告。您似乎想按id订购行。

你显然不希望整数除法,这会截断小数位数。我转向numeric并将结果四舍五入到结果中的两个小数位。

相关答案:

理解其工作原理的关键是SELECT查询中的平均序列: