背景 当操作员按下网页上的按钮时,我有几个硬件设备(控制器)被发送到这些设备。我们正在研究为什么有时沟通很慢。我设置了一个python自动脚本来刮擦页面并在三个独立的控制器上每分钟更改控制器模式。我记录了操作的开始和持续时间。
示例数据:
Id Cont_id Start_time (pst) Duration (sec)
316 11002 2017-06-22 20:05:13 5
317 6224 2017-06-22 20:05:38 15
319 7782 2017-06-22 20:06:20 15
318 11002 2017-06-22 20:06:20 5
320 6224 2017-06-22 20:06:56 15
321 11002 2017-06-22 20:07:27 5
336 7782 2017-06-22 20:07:38 500
322 6224 2017-06-22 20:08:14 15
323 11002 2017-06-22 20:08:36 5
324 6224 2017-06-22 20:09:32 10
325 11002 2017-06-22 20:09:43 10
326 6224 2017-06-22 20:10:44 10
327 11002 2017-06-22 20:10:55 10
328 6224 2017-06-22 20:11:56 5
329 11002 2017-06-22 20:12:07 15
330 6224 2017-06-22 20:13:03 10
期望的结果 我想要一个每分钟都有一个条目的报告,并告诉我每个控制器在当前操作中的时间。例如,考虑样本数据(控制器7782)中的时间~20:07。我想看到以下内容;
sample_time | cont_id | last_start_time | time_in_operation
20:08:00* | 7782 | 20:07:38 | 22
20:08:00 | 11002 | 20:07:27 | 5 *
20:08:00 | 6224 | 20:06:56 | 15
20:09:00 | 7782 | 20:07:38 | 88
20:09:00 | 11002 | 20:08:36 | 5
20:09:00 | 6224 | 20:08:14 | 15
20:10:00 | 7882 | 20:07:38 | 148
....etc
问题:我最大的问题是每分钟都会出现一个模拟条目。一旦解决了,我想我可以得到其余的...所以,我如何编写一个查询,为我提供两个时间范围之间每分钟的条目,以我可以用来计算最终报告的方式编写根据样本数据。
设定:
CREATE TABLE public.operationtimelog (
id int4 NOT NULL DEFAULT nextval('operationtimelog_id_seq'::regclass),
controller_id int4 NOT NULL,
op_start_time timestamp NOT NULL,
op_duration int4 NOT NULL,
CONSTRAINT operationtimelog_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
insert into
operationtimelog (controller_id, op_start_time, op_duration) values
(11002, '2017-06-22 20:05:13', 5),
(6224, '2017-06-22 20:05:38', 15),
(7782, '2017-06-22 20:06:20', 15),
(11002, '2017-06-22 20:06:20', 5),
(6224, '2017-06-22 20:06:56', 15),
(11002, '2017-06-22 20:07:27', 5),
(7782, '2017-06-22 20:07:38', 500),
(6224, '2017-06-22 20:08:14', 15),
(11002, '2017-06-22 20:08:36', 5),
(6224, '2017-06-22 20:09:32', 10),
(11002, '2017-06-22 20:09:43', 10),
(6224, '2017-06-22 20:10:44', 10),
(11002, '2017-06-22 20:10:55', 10),
(6224, '2017-06-22 20:11:56', 5),
(11002, '2017-06-22 20:12:07', 15)
答案 0 :(得分:1)
回答你的问题:给定两个时间戳生成一个表,其中包含它们之间每分钟的记录。
select time_column
from generate_series(
'2017-06-22 20:00:00'::TIMESTAMP,
'2017-06-22 20:09:00'::TIMESTAMP,
'1m'
) x(time_column)
输出:
time_column
---------------------
2017-06-22 20:00:00
2017-06-22 20:01:00
2017-06-22 20:02:00
2017-06-22 20:03:00
2017-06-22 20:04:00
2017-06-22 20:05:00
2017-06-22 20:06:00
2017-06-22 20:07:00
2017-06-22 20:08:00
2017-06-22 20:09:00
然后,您可以使用LEFT JOIN
将您的表/查询连接到该时间列,并从示例数据中截断op_start_time
秒。
如何截断时间戳的秒数?
select date_trunc('m','2017-06-22 20:07:38'::timestamp)
输出:
date_trunc
---------------------
2017-06-22 20:07:00