Postgres:计算不同日期的多个事件

Postgres: Count multiple events for distinct dates

Stack Overflow 的人!

感谢您花时间阅读这个问题。我想要完成的是仅从一个 table 中转换一些数据。 原始 table 具有特定事件的多个日期时间条目(例如,何时添加客户 add_time 以及何时失去客户 lost_time)。 这是两行交易的一部分 table:

编号 add_time last_mail_time lost_time
5 2020-03-2409:29:24 2020-04-0313:20:29
310 2020-03-2409:29:24 2020-04-0313:20:29

我想创建一个视图 table。一个视图,每个不同的日期各占一行,并计算该特定时间的事件数。

这是目标(时间与示例不符!):

我有工作代码,像这样:

SELECT DISTINCT
    change_datetime,
    (SELECT COUNT(add_time) as add_time_count FROM deals WHERE add_time::date = change_datetime),
    (SELECT COUNT(lost_time) as lost_time_count FROM deals WHERE lost_time::date = change_datetime) 
FROM (
    SELECT
        add_time::date AS change_datetime
    FROM
        deals
    UNION ALL
    SELECT
        lost_time::date AS change_datetime
    FROM
        deals
    ) AS foo
WHERE change_datetime IS NOT NULL
ORDER BY
    change_datetime;

但这有一些难看的 O(n2) 查询并且需要很多时间。

是否有更好、更高效的方法来实现这一点?

谢谢!!

您可以使用横向连接来反透视然后聚合:

select t::date,
       count(*) filter (where which = 'add'),
       count(*) filter (where which = 'mail'),
       count(*) filter (where which = 'lost')
from deals d cross join lateral
     (values (add_time, 'add'),
             (last_mail_time, 'mail'),
             (lost_time, 'lost')
     ) v(t, which)
group by t::date;