2014-10-23 48 views
5

Czuję, że brakuje mi czegoś oczywistego. Próbuję przetestować dystrybucję random(). Oto tabela:Podział liczb całkowitych zwraca 0

create table test (
    id int, 
    random_float float, 
    random_int int 
); 

tutaj jest to, co chcę zrobić:

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; 

Jednakże, "procent" kolumna zwraca zero dla każdego rekordu. Próbowałem rzucić go jako float, jako dziesiętne, próbowałem zmienić kolumnę random_int na dziesiętne zamiast liczby całkowitej, zawsze taki sam wynik.

Here is a fiddle.

Każdy wgląd, co robię źle?

+1

Przesyłaj do 'numeric' (lub' float', chociaż wolę ten pierwszy) * przed * podzielisz. – vyegorov

+0

Możesz odtworzyć to w jednym wierszu: 'wybierz 1/2'. Zwraca 0. – usr

+0

@Phrancis, powinieneś rzucić * przed * dzielisz: 'wybierz 1/2, 1.0/2, 1.0 * 1/2, 1 :: numeryczne/2, rzucaj (1 jako zmiennopozycyjne)/2;' – vyegorov

Odpowiedz

4

Powinieneś rzucić, zanim podzielisz, ale także nie masz podkwerendy, aby uzyskać całkowitą liczbę z tabeli. 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

Dzięki, która bardzo pomaga. – Phrancis

2

Spróbuj zapytania zamiast:

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 ma silny system typów. W twoim przypadku typ jest implikowany przez funkcję count(), która zwraca bigint (lub int8) i id kolumnę, która jest integer.

Polecam, używając jako mnożnika początkowego 100.0, który spowoduje przeliczenie całego wyrażenia jako liczbowego i zapewni rzeczywiste procenty. Możesz także rzucić na koniec na numeric(5,2), aby pozbyć się zbyt dużej liczby.