在 PostgreSQL 中计算费率
Posted
技术标签:
【中文标题】在 PostgreSQL 中计算费率【英文标题】:Calculating rates in PostgreSQL 【发布时间】:2018-04-25 21:45:52 【问题描述】:尝试做一些非常简单的事情并通过邮件计算signup_flow 速率。
我有一个名为 signup_flow
的列 - 每行都有一个整数值 1 或 0。尝试计算每个邮件的 signup_flow 速率。
我正在使用以下查询。 SUM(signup_flow)
和 COUNT(signup_flow)
每次邮寄都会返回正确的值。当我尝试做一个简单的计算字段(sum/count*100)
它返回0。这是我第一次使用Postgres,它不支持计算吗?
SELECT mailing, SUM(signup_flow), COUNT(signup_flow),
((SUM(signup_flow)/COUNT(signup_flow))*100) AS rate
FROM mail_2017_analytic_file
GROUP BY mailing;
结果:
mailing sum count rate
DEC 17 RRD Mailing 2535 1085476 0
JAN 17 RRD Mailing 8275 3695017 0
MAR 17 RRD Mailing 7230 3595594 0
MAY 17 RRD Mailing 5616 2672981 0
JULY 17 RRD Mailing 7837 3741944 0
AUG 17 RRD Mailing 9272 4604807 0
OCT 17 RRD Mailing 7982 4996146 0
【问题讨论】:
【参考方案1】:改用这个表达式:
SUM(signup_flow) * 100.0 / COUNT(signup_flow) AS rate
与@Richard suggested 一样,您的问题是整数除法,其中小数位被截断。手册:
/
...除法(整数除法会截断结果)
当你得到的只是小数时,这会破坏乐趣。
在除法之前乘以100
只有在将rate
增加到1 或更多时才会“有帮助”。 (它仍然是整数除法。)乘以 100.0
可以解决问题,因为带有小数位的数字常量被假定为 numeric
类型,而仅由数字组成的数字常量(和足够小)被假定为类型integer
。
或者,将至少一个涉及的数字显式转换为 float
或 numeric
,这会在整个计算中强制使用非整数类型。
您可能希望round()
您的结果为给定的小数位数(适用于numeric
):
round(SUM(signup_flow) * 100.0 / COUNT(signup_flow), 2) AS rate
相关(有更多解释和链接):
Convert numeric result to percentage with decimal digits【讨论】:
【参考方案2】:这些值将是整数,因此计算将使用整数算术。这意味着除法通常会得到零,然后乘以 100。
如果您对整数百分比感到满意,请先乘以 100,而不是最后乘以。
如果你想要浮点数学先求和。
【讨论】:
当我先乘以 100 然后除以 count(*) 时仍然为 0以上是关于在 PostgreSQL 中计算费率的主要内容,如果未能解决你的问题,请参考以下文章