使用 SQL 计算组大小的比率

Compute ratio of group sizes using SQL

考虑一个简单的分组查询:

select foo, count(*)
    from mytable where bar=10 
group by foo

此 returns 具有以下形式的 table:

foo | count
----+------
a   | 100
b   | 200
c   | 300

我的目标是使用单个查询获得以下 table:

foo | count | ratio
----+-------+-------
a   | 200   | 18.2
b   | 300   | 27.3
c   | 600   | 54.5

实际上,我有更多 foo 的可能值,因此 here 中的答案没有帮助。此外,并不是说比率四舍五入并乘以 100。

执行此操作的最佳做​​法是什么?

听起来你想要这样的东西:

select foo, count(*),
       count(*) * 100.0 / sum(count(*)) over () as ratio
from mytable
where bar = 10 
group by foo;

这并不能保证四舍五入后的值加起来正好是 100%。这是一个更棘手的问题,通常在应用层更好地处理。这确实会产生 "correct" 答案,使用浮点数。

这是一个拖拽自己数据的工作示例 - 您可以根据自己的需要对其进行修改:

    SQL>WITH mytable(
    ...>foo , counter
    ...>) AS (
    ...>          SELECT 'a',200
    ...>UNION ALL SELECT 'b',300
    ...>UNION ALL SELECT 'c',600
    ...>)
    ...>SELECT
    ...>  foo
    ...>, counter
    ...>, (counter * 100.0 / SUM(counter) OVER ())::NUMERIC(3,1) AS ratio
    ...>FROM mytable
    ...>;
    foo|counter             |ratio
    a  |                 200| 18.2
    b  |                 300| 27.3
    c  |                 600| 54.5
    select succeeded; 3 rows fetched

玩的开心... 马科塞桑