Postgres的错误输出

时间:2018-06-14 22:27:06

标签: postgresql

我正在加入3个表来获得保留率。这是我的疑问:

select first_visit.first_month as first_month, 
       new_users.new_users as new_users, 
       count(distinct visit_tracker.customer__id) as retained, 
       cast(count(distinct visit_tracker.customer__id) / new_users.new_users as float) as retention_percent 
from first_visit
left join visit_tracker
on visit_tracker.customer__id=first_visit.customer__id 
left join new_users 
on new_users.first_month=first_visit.first_month 
group by 1,2;

我得到以下输出:

first_month new_users retained retention_percent
0           93        34       0
1           119       42       0
2           188       102      0
3           223       71       0

等等

我想要的是:

first_month new_users retained retention_percent
    0           93        34       0.37
    1           119       42       0.35
    2           188       102      0.54
    3           223       71       0.32

我不确定为什么它没有产生我想要的结果。有什么输入吗?

1 个答案:

答案 0 :(得分:1)

这看起来像整数除法问题的经典案例。

在这种情况下,count(distinct visit_tracker.customer__id)将返回一个整数,然后除以float。看起来浮点数被转换为整数,因此除法的结果是整数。因为预期答案小于1,所以它会截断为零。查询的as float部分无效,因为截断已经发生后会发生这种情况。

在执行除法之前,请确保分子和分母都是浮点数,或者事先按this stackoverflow answer建议乘以100。