我觉得我错过了一些明显的东西。我试图测试random()
的分布。这是表格:
create table test (
id int,
random_float float,
random_int int
);
这是我想要做的:
truncate table test;
insert into test (id)
values (generate_series(1,1000));
update test
set
random_float = random() * 10 + 1;
update test
set
random_int = trunc(random_float);
select
random_int,
count(random_int) as Count,
cast( count(random_int) / max(id) as float) as Percent
from test
group by random_int
order by random_int;
但是,“Percent”列为每条记录返回零。我尝试将其转换为float,作为十进制,我尝试将random_int
列更改为十进制而不是整数,总是相同的结果。
有关我做错的任何见解?
答案 0 :(得分:10)
你应该在划分之前进行投射,但是你也缺少一个子查询来从表中获得总数。 Here's the sample
select
random_int,
count(random_int) as Count,
cast(count(random_int) as decimal(7,2)) / cast((select count(random_int) from test) as decimal(7,2)) as Percent
from test
group by random_int
order by random_int;
答案 1 :(得分:2)
请尝试此查询:
select
random_int,
count(random_int) as Count,
cast( count(random_int) / max(id) as float) as Percent,
(100.0 * count(random_int) / max(id))::numeric(5,2) as pct
from test
group by random_int
order by random_int;
PostgreSQL有一个强大的类型系统。在您的情况下,count()
函数隐含了类型,该函数返回bigint
(或int8
)和id
列,即integer
。
我建议使用100.0
作为初始乘数,这将导致整个表达式计算为数字,并且还将提供真实百分比。您可能还希望在结尾处转换为numeric(5,2)
以消除太大的数字。