2014-10-23 7 views
5

Я чувствую, что мне не хватает чего-то очевидного. Я пытаюсь проверить распределение random(). Вот таблица:Отдел целых чисел 0

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; 

Однако в столбце «Процент» возвращает ноль для каждой записи. Я попытался использовать его как float, как десятичный, я попытался изменить столбец random_int на десятичный, а не на целое, всегда на тот же результат.

Here is a fiddle.

Любое понимание относительно того, что я делаю неправильно?

+1

Вставить в 'числовые' (или' float', хотя я предпочитаю первый) * до * вы делите. – vyegorov

+0

Вы можете воспроизвести это в одной строке: 'select 1/2'. Возвращает 0. – usr

+0

@Phrancis, вы должны использовать * перед *, вы делите: 'select 1/2, 1.0/2, 1.0 * 1/2, 1 :: numeric/2, cast (1 as float)/2;' – vyegorov

ответ

4

Вы должны отличить, прежде чем делиться, но также вам не хватает подзапроса, чтобы получить общее количество из таблицы. 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; 
+0

Спасибо, что очень помогает. – Phrancis

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) в конце, чтобы избавиться от слишком большого числа.

Смежные вопросы