Postgresql 在SQL中使用两个时间戳列在一个";时间点;
我有一个带票证表的Postgres数据库。每张票证都有一个“created_at”时间戳和一个“resolved_at”时间戳。我最终希望创建一个时间序列可视化来跟踪“未解决”票证的数量 例如,我想看看过去的24小时,看看在每个小时结束时有多少票证没有解决,即有多少票证是在“时间点”创建的,有多少票证是在“时间点”解决的 我不知道我是如何开始查询这类信息的。如何在查询中引用多个“时间点值” 设置示例:Postgresql 在SQL中使用两个时间戳列在一个";时间点;,postgresql,sql-timestamp,Postgresql,Sql Timestamp,我有一个带票证表的Postgres数据库。每张票证都有一个“created_at”时间戳和一个“resolved_at”时间戳。我最终希望创建一个时间序列可视化来跟踪“未解决”票证的数量 例如,我想看看过去的24小时,看看在每个小时结束时有多少票证没有解决,即有多少票证是在“时间点”创建的,有多少票证是在“时间点”解决的 我不知道我是如何开始查询这类信息的。如何在查询中引用多个“时间点值” 设置示例: CREATE TABLE tickets ( id int, created_
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
欢迎我是这里的一个新来者,我会第一个警告你,你可能会因为发布文本图像而被责骂。如果人们能够看到、复制并使用您的示例,他们会更容易提供帮助。您是否可以编辑问题以将表定义、示例数据和目标输出作为文本包含在内?很可能,这会很快给你一个好答案。谢谢你的提示,我会尽量让它更容易使用