Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在SQL中使用两个时间戳列在一个";时间点;_Postgresql_Sql Timestamp - Fatal编程技术网

Postgresql 在SQL中使用两个时间戳列在一个";时间点;

Postgresql 在SQL中使用两个时间戳列在一个";时间点;,postgresql,sql-timestamp,Postgresql,Sql Timestamp,我有一个带票证表的Postgres数据库。每张票证都有一个“created_at”时间戳和一个“resolved_at”时间戳。我最终希望创建一个时间序列可视化来跟踪“未解决”票证的数量 例如,我想看看过去的24小时,看看在每个小时结束时有多少票证没有解决,即有多少票证是在“时间点”创建的,有多少票证是在“时间点”解决的 我不知道我是如何开始查询这类信息的。如何在查询中引用多个“时间点值” 设置示例: CREATE TABLE tickets ( id int, created_

我有一个带票证表的Postgres数据库。每张票证都有一个“created_at”时间戳和一个“resolved_at”时间戳。我最终希望创建一个时间序列可视化来跟踪“未解决”票证的数量

例如,我想看看过去的24小时,看看在每个小时结束时有多少票证没有解决,即有多少票证是在“时间点”创建的,有多少票证是在“时间点”解决的

我不知道我是如何开始查询这类信息的。如何在查询中引用多个“时间点值”

设置示例:

CREATE TABLE tickets (
    id int,
    created_at timestamp,
    resolved_at timestamp
);

INSERT INTO tickets VALUES
(1, '2019-10-01 01:30:00'::timestamp, '2019-10-01 05:45:00'::timestamp),
(2, '2019-10-01 02:30:00'::timestamp, '2019-10-01 05:45:00'::timestamp),
(3, '2019-10-01 03:30:00'::timestamp, '2019-10-01 05:45:00'::timestamp),
(4, '2019-10-01 04:30:00'::timestamp, '2019-10-01 05:45:00'::timestamp),
(5, '2019-10-01 05:30:00'::timestamp, '2019-10-01 05:45:00'::timestamp);

我可以通过查看这些数据看出,在01:00时,我们有0个未解决问题,在02:00时,有1个未解决问题(票证1),05:00 4未解决,06:00 0未解决(所有票据在05:45前得到解决)。我不确定如何查询此信息

我们将通过三个逻辑步骤找到解决方案。首先,及时获取一系列事件:

select created_at as event_time, 1 as change
from tickets
union all
select resolved_at, -1
from tickets
order by 1

     event_time      | change 
---------------------+--------
 2019-10-01 01:30:00 |      1
 2019-10-01 02:30:00 |      1
 2019-10-01 03:30:00 |      1
 2019-10-01 04:30:00 |      1
 2019-10-01 05:30:00 |      1
 2019-10-01 05:45:00 |     -1
 2019-10-01 05:45:00 |     -1
 2019-10-01 05:45:00 |     -1
 2019-10-01 05:45:00 |     -1
 2019-10-01 05:45:00 |     -1
(10 rows)
接下来,将时间四舍五入到整小时,并将更改相加:

select 
    date_trunc('hour', event_time+ interval '1h') as time_point, 
    sum(change) as change
from (
    select created_at as event_time, 1 as change
    from tickets
    union all
    select resolved_at, -1
    from tickets
    ) s
group by 1
order by 1

     time_point      | change 
---------------------+--------
 2019-10-01 02:00:00 |      1
 2019-10-01 03:00:00 |      1
 2019-10-01 04:00:00 |      1
 2019-10-01 05:00:00 |      1
 2019-10-01 06:00:00 |     -4
(5 rows)
最后,获得连续期间的累计变化总和:

select 
    time_point, 
    sum(change) over (order by time_point) as unresolved
from (
    select
        date_trunc('hour', event_time+ interval '1h') as time_point, 
        sum(change) as change
    from (
        select created_at as event_time, 1 as change
        from tickets
        union all
        select resolved_at, -1
        from tickets
        ) s
    group by 1
    ) s 
order by 1

     time_point      | unresolved 
---------------------+------------
 2019-10-01 02:00:00 |          1
 2019-10-01 03:00:00 |          2
 2019-10-01 04:00:00 |          3
 2019-10-01 05:00:00 |          4
 2019-10-01 06:00:00 |          0
(5 rows)
在最终查询中,您可以使用时间戳序列(由函数生成)来避免间隙:

select 
    time_point, 
    coalesce(sum(change) over (order by time_point), 0) as unresolved
from 
    generate_series(timestamp '2019-10-01 01:00', '2019-10-01 06:00', interval '1h') as time_point
left join (
    select
        date_trunc('hour', event_time+ interval '1h') as time_point, 
        sum(change) as change
    from (
        select created_at as event_time, 1 as change
        from tickets
        union all
        select resolved_at, -1
        from tickets
        ) s
    group by 1
    ) s using(time_point)
order by 1

欢迎我是这里的一个新来者,我会第一个警告你,你可能会因为发布文本图像而被责骂。如果人们能够看到、复制并使用您的示例,他们会更容易提供帮助。您是否可以编辑问题以将表定义、示例数据和目标输出作为文本包含在内?很可能,这会很快给你一个好答案。谢谢你的提示,我会尽量让它更容易使用