【问题标题】:Postgres: Count multiple events for distinct datesPostgres:计算不同日期的多个事件
【发布时间】:2021-06-15 16:50:49
【问题描述】:

堆栈溢出的人!

感谢您抽出宝贵时间阅读此问题。我想要完成的是仅从一张表中透视一些数据。 原始表有多个特定事件的日期时间条目(例如,添加客户时add_time 和客户丢失时lost_time)。 这是交易表两行的一部分:

id add_time last_mail_time lost_time
5 2020-03-24 09:29:24 2020-04-03 13:20:29 NULL
310 2020-03-24 09:29:24 NULL 2020-04-03 13:20:29

我想创建这个表的视图。一种视图,每个不同的日期都有一行,并计算该特定时间的事件数。

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

我有工作代码,如下所示:

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) 查询并且需要很多时间。

有没有更好、更高效的方法来实现这一目标?

谢谢!!

【问题讨论】:

    标签: sql postgresql pivot subquery


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 你真是个天才,谢谢!一旦 Stackoverflow 让我(再过 9 分钟),我就会接受这个答案。
    • 顺便说一句,我无法编辑您的代码,因为编辑需要至少 6 个字符,但(last_mail_time, 'mail') 之后的代码中存在语法错误(忘记逗号)
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多