Расчет ставок в PostgreSQL - PullRequest
       5

Расчет ставок в PostgreSQL

0 голосов
/ 26 апреля 2018

Попытка сделать что-то очень простое и рассчитать скорость 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

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вместо этого используйте это выражение:

    SUM(signup_flow) * 100.0 / COUNT(signup_flow) AS rate

Как и @ Ричард предложил , ваша проблема целочисленное деление , где дробные цифры усекаются.Руководство:

/ ... деление (целочисленное деление усекает результат)

Это портит удовольствие, когда все, что вы получите, это дробные цифры.

Умножение на 100 до того, как деление только "помогает", если оно увеличивает rate до 1 или более.(Это все еще целочисленное деление.) Умножение на 100.0 делает свое дело, потому что числовая константа с дробной цифрой считается типом numeric, тогда как числовая константа, состоящая только из цифр (и маленькихдостаточно) предполагается тип integer.

В качестве альтернативы приведите хотя бы одно задействованное число к явному значению float или numeric, что приводит к нецелочисленному типу для всего вычисления.

Возможно, вы захотите round() вашего результата до заданного числа дробных цифр (работает для numeric):

    round(SUM(signup_flow) * 100.0 / COUNT(signup_flow), 2) AS rate

Связано (с дополнительными пояснениями и ссылками):

0 голосов
/ 26 апреля 2018

Эти значения будут целыми числами, поэтому при вычислении будет использоваться целочисленная арифметика.Это означает, что деление обычно приводит к нулю, который вы затем умножаете на 100.

Если вас устраивает целочисленный процент, просто умножьте сначала на 100, а не на последний.

Если вы хотите с плавающей запятойматематика разыгрывает первую сумму.

...