получить данные с подсчетом и сгруппировать по postgres - PullRequest
0 голосов
/ 07 мая 2020

У меня есть таблица mail_details

|   mail_id   | sent_time          |  failed_time       | mail_type   |
|   (bigint)  |  (timestamp)       |    (timestamp)     |  (varvharing)
-----------------------------------------------------------------------
|    1        | 2020-02-05         |  null(default)     |   type-t       
|    2        | 2020-02-05         |  null(default)     |   type-t
|    3        | 2020-02-05         |  null(default)     |   type-m
|    4        | 2020-02-05         |  null(default)     |   type-p
|    5        | null(default)      |  2020-02-05        |   type-p
|    6        | 2020-02-05         |  null(default)     |   type-m
|    8        | 2020-02-05         |  null(default)     |   type-m
|    9        | null(default)      |  2020-02-05        |   type-m
|    10       | 2020-02-05         |  null(default)     |   type-n
|    11       | 2020-02-05         |  null(default)     |   type-n

Всякий раз, когда письмо, отправленное пользователю, я обновляю sent_time или отправленное письмо не удается, я обновляю failed_time

Теперь я хочу fetch total number of mail sent (count) and the total number of mail failed (count) с respective date, где mail_type = (type_t или type_p или type_m или type_n)

вывод будет похож на

+---------------------+----------------+----------------+
|date                 |tatal_sent_mail |tatal_failed_mail|
+---------------------+----------------+----------------+
|2020-05-05           |8               |2               |
+---------------------+----------------+----------------+

Я пробовал с count, но не работал. Любая помощь будет принята.

Ответы [ 4 ]

1 голос
/ 07 мая 2020
• 1000
1 голос
/ 07 мая 2020

Я бы развернул, используя боковой join, и суммировал бы:

select time::date, sum(is_sent), sum(is_fail)
from mail_details md cross join lateral
     (values (sent_time, (sent_time is not null)::int, 0)
             (failed_time, 0, (failed is not null)::int)
     ) v(time, is_sent, is_fail)
where t.time is not null and
      md.mail_type in ('type_t','type_p','type_m','type_n')
group by time::date
0 голосов
/ 07 мая 2020

Еще один, использующий FULL OUTER JOIN во встроенном представлении,

select sent_time as date,tatal_sent_mail,tatal_failed_mail
from 
(select sent_time,count(1) tatal_sent_mail
where mail_type in ('type_t','type_p','type_m','type_n')
group by sent_time) sent_data
FULL OUTER JOIN 
(select failed_time Final_date,count(1) tatal_failed_mail
where mail_type in ('type_t','type_p','type_m','type_n')
group by failed_time) failed_Data
ON sent_data.sent_time = failed_Data.failed_time
0 голосов
/ 07 мая 2020

Используя объединение, это должно сработать:

SELECT  dt,
        SUM(CASE WHEN event == 'SENT' then 1 else 0 end) total_sent_mail,
        SUM(CASE WHEN event == 'FAIL' then 1 else 0 end) total_failed_mail,
FROM
    (   SELECT  'SENT' as event,
                sent_time as dt 
        FROM    mail_details
        WHERE   sent_time IS NOT NULL   )
    UNION ALL
    (   SELECT  'FAIL' as event,
                failed_time as dt
        FROM    mail_details
        WHERE   failed_time IS NOT NULL  )
GROUP BY dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...