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

wh6knrhe  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(61)

我有一个这样的表格格式(显然,简化):
| 会话ID|时间戳|行动|消息|
| --|--|--|--|
| 4de88be3-2316-4efa-8e17-58a2365534d9|两点零四分|4363d58b-c9fe-43a1-b636-c65822329aa3|初始|
| 4de88be3-2316-4efa-8e17-58a2365534d9|两点零五分|d4294aaf-3fee-4154-a3de-b2f9c05a0cf1|排队|
| 4de88be3-2316-4efa-8e17-58a2365534d9| 2点10分|dc40eaec-2aed-4b24-9b8e-ff1e25194036|连接|
| 4de88be3-2316-4efa-8e17-58a2365534d9|两点三十二分|dd93f0d4-7db9-4a68-876b-956db9300841|挂断|
当然,注意到多个会话可能同时发生,我试图弄清楚如何编写一个查询来返回类似于下面的行:
| 会话ID|初始|连接|排队|挂断|
| --|--|--|--|--|
| 4de88be3-2316-4efa-8e17-58a2365534d9|两点零四分|两点零五分|2点10分|两点三十二分|
我将更改其中一些值以显示持续时间,以及其他一些工作,但我似乎无法弄清楚如何获得具有单个行的初始输出,该行使用多个其他行来获取其数据(特别是以有效的方式,我尝试在会话ID上执行for循环,这真的很慢)
我可以在后台用一种编码语言来做这个,让它把结果转储到一个临时表中,但是如果有可能创建一个这样的视图,我更喜欢这样。我整个早上都在把头撞在table上试图弄清楚这个问题。只是需要在我失去理智之前朝着正确的方向推动一下:)
任何帮助都非常感谢
再次感谢@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

字符串

mdfafbf1

mdfafbf11#

如果每个事件在每个会话中只发生一次,则可以在会话中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

字符串

相关问题