在 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

或者,将至少一个涉及的数字显式转换为 floatnumeric,这会在整个计算中强制使用非整数类型。

您可能希望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 中计算费率的主要内容,如果未能解决你的问题,请参考以下文章

Postgres数据库之聚集函数内核源码学习总结

何为PostgreSQL?

PostgreSQL新手入门

PostgreSQL 备忘清单_开发速查表分享

PostgreSQL忘记postgres账号密码的解决方法

您如何计算在大型 Postgresql 表上创建索引的时间?