【问题标题】:Given start times and duration, show duration since started for every minute on the minute给定开始时间和持续时间,显示每分钟开始以来的持续时间
【发布时间】:2017-06-23 15:02:58
【问题描述】:

背景: 当操作员按下网页上的按钮时,我有几个硬件设备(控制器)正在向它们发送命令。我们正在调查为什么有时通信速度很慢。我设置了一个 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

期望的结果: 我想要一份报告,每分钟都有一个条目,并告诉我每个控制器当前运行了多长时间。例如,考虑样本数据中约 20:07 的时间(控制器 7782)。我想看到以下内容;

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
  • 注意 1:为了简洁起见,我显示时间 - 实际上我想要整个日期/时间 注2:这是5秒,因为操作完成了,所以使用 持续时间值。

问题:我最大的问题是每分钟都想出一个模拟条目。一旦解决了这个问题,我想我可以得到其余的......那么,我如何编写一个查询,让我在两个时间范围之间的每一分钟都有一个条目,以我可以用来计算最终报告的方式编写为根据样本数据。

设置:

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)

【问题讨论】:

  • 我不明白逻辑,为什么你必须得到条目 id 336 的期望结果
  • @OtoShavadze:谢谢……如果你不明白,其他人也不会明白。我已经更新了所需的结果,如果足够清晰,请告诉我。
  • @SteveJ,因为您使用解决方案更新了您的问题,请在末尾添加 select * from durations 以使其正常工作:-)

标签: sql postgresql


【解决方案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

【讨论】:

  • 这就是我要找的作品 - 谢谢。如果我被难住了,我会接受它并运行它并回发。如果可行,我想我应该编辑问题以摆脱多余的内容并将其标记为答案。
  • 当然,我什至没有深入研究你的陈述逻辑,因为我发现了这个问题,而且额外的上下文让我很模糊。
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多