2014-10-23 13 views
5

Tôi cảm thấy mình thiếu một điều gì đó hiển nhiên. Tôi đang cố gắng kiểm tra sự phân bố của random(). Dưới đây là bảng:Phân chia các số nguyên trả về 0

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

đây là những gì tôi muốn làm:

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; 

Tuy nhiên, "Phần trăm" cột trả về zero cho mỗi bản ghi. Tôi đã cố gắng đúc nó như float, như thập phân, tôi đã cố gắng thay đổi cột random_int thành thập phân thay vì số nguyên, luôn luôn là kết quả tương tự.

Here is a fiddle.

Bất kỳ thông tin chi tiết nào về những gì tôi đang làm sai?

+1

Truyền sang 'số' (hoặc' float', mặc dù tôi thích trước đây) * trước * bạn chia. – vyegorov

+0

Bạn có thể sao chép điều này trong một dòng: 'chọn 1/2'. Trả về 0. – usr

+0

@Phrancis, bạn nên bỏ * trước khi * bạn chia: 'chọn 1/2, 1.0/2, 1.0 * 1/2, 1 :: số/2, truyền (1 làm nổi)/2;' – vyegorov

Trả lời

4

Bạn nên bỏ trước khi chia, nhưng bạn cũng bỏ lỡ truy vấn phụ để nhận tổng số từ bảng. 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

Cảm ơn điều đó giúp ích rất nhiều. – Phrancis

2

Hãy thử truy vấn này để thay thế:

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 có một hệ thống các loại mạnh. Trong trường hợp của bạn, loại được ngụ ý bởi hàm count(), trả về bigint (hoặc int8) và cột id, là integer.

Tôi khuyên bạn nên sử dụng 100.0 làm hệ số ban đầu, điều đó sẽ khiến toàn bộ biểu thức được tính là số và cũng sẽ cung cấp phần trăm thực. Bạn cũng có thể muốn truyền tới numeric(5,2) ở cuối để loại bỏ số lượng quá lớn.

Các vấn đề liên quan