代码之家  ›  专栏  ›  技术社区  ›  Para

pgsql-返回包含多行数据的行

  •  1
  • Para  · 技术社区  · 1 年前

    我有一个表格的格式是这样的(显然是简化的):

    会话id 时间戳 行动 消息
    4de88be3-2316-4efa-8e17-58a23655534d9 2:04 4363d58b-c9fe-43a1-b636-c65822329aa3 最初的
    4de88be3-2316-4efa-8e17-58a23655534d9 2:05 d4294af-3英尺-4154-a3de-b2f9c05a0cf1 排队的
    4de88be3-2316-4efa-8e17-58a23655534d9 2:10 dc40eaec-2aed-4b24-9b8e-f25194036 有联系的
    4de88be3-2316-4efa-8e17-58a23655534d9 2:32 dd93f0d4-7db9-4a68-876b-956db9300841 挂断

    注意到多个会话可能同时发生,当然,我正试图弄清楚如何编写查询以返回类似于以下的行:

    会话id 最初的 有联系的 排队的 挂断
    4de88be3-2316-4efa-8e17-58a23655534d9 2:04 2:05 2:10 2:32

    我将更改其中的一些值,以显示持续时间和其他一些工作,但我似乎不知道如何获得一行使用多个其他行获取数据的初始输出(尤其是以一种有效的方式,我尝试在会话ID上进行for循环,这真的很慢)

    我可以用编码语言在后台完成这项工作,让它将结果转储到临时表中,但如果可以创建这样的视图,我更喜欢这样。我整个上午都在用头撞桌子,试图弄清楚这一点。在我失去理智之前,只需要朝着正确的方向推动一下:)

    非常感谢您的帮助

    再次感谢@Andomar 我的最后一个查询结果是这样的,我现在可以使用它来构建KPI报告。我想我只需要离开这个问题几分钟,理清思路

    select
        session_id,
        initial,
        queued - initial as time_to_queue,
        connected - queued as time_in_queue,
        hangup - connected as time_in_call,
        hangup - initial as total_time,
        hangup
    from
    (SELECT
        session_id,
        MIN(CASE WHEN action = '4363d58b-c9fe-43a1-b636-c65822329aa3' THEN timestamp END) AS initial,
        MIN(CASE WHEN action = 'd4294aaf-3fee-4154-a3de-b2f9c05a0cf1' THEN timestamp END) AS queued,
        MIN(CASE WHEN action = 'dc40eaec-2aed-4b24-9b8e-ff1e25194036' THEN timestamp END) AS connected,
        MIN(CASE WHEN action = 'dd93f0d4-7db9-4a68-876b-956db9300841' THEN timestamp END) AS hangup
    FROM
        cdr
    where date(((timestamp at TIME zone 'UTC') at TIME zone 'US/Eastern')::timestamptz) >= '2023-12-07'
    GROUP BY
        session_id) x
    where initial is not null --ignore outbound calls
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Andomar    1 年前

    如果每个会话中每个事件只发生一次,则可以 group by 在会话中,并采取 max() (或 min() )该消息的时间戳:

    select  session_id,
    ,       max(case when message = 'initial' then timestamp end) as initial
    ,       max(case when message = 'connected' then timestamp end) as connected
    ,       max(case when message = 'queued' then timestamp end) as queued
    ,       max(case when message = 'hangup' then timestamp end) as hangup
    from    YourTable
    group by
            session_id