使用 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
玩的开心...
马科塞桑
考虑一个简单的分组查询:
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
玩的开心... 马科塞桑