从PLC记录中选择停止时间

时间:2019-05-13 11:07:27

标签: sql sql-server

_timestamp            throughput_net
2019-05-01 07:46:08.000    15.8
2019-05-01 07:46:38.000    15.8
2019-05-01 07:47:09.000    15.8
2019-05-01 07:47:39.000    15.8
2019-05-01 07:48:09.000    15.8
2019-05-01 07:48:39.000    15.8
2019-05-01 07:49:09.000    15.8
2019-05-01 12:46:52.000    0
2019-05-01 12:47:22.000    0
2019-05-01 12:47:53.000    0
2019-05-01 12:48:23.000    0
2019-05-01 12:48:53.000    0
2019-05-01 12:49:23.000    0
2019-05-01 12:49:53.000    0
2019-05-01 12:50:23.000    0 

我每30秒从机器PLC获得的上述值,机器的吞吐量为1500 KG / hr,但是在机器停止期间,吞吐量将类似于上面的数据。

问题是我需要输出像下面的表格

 ---------------------------------------
|    From    |     To    | Period in min|
 ---------------------------------------
| 07:46:08   | 07:49:09  |     3        |
| 12:46:52   | 12:50:23  |     4        |
 ---------------------------------------

2 个答案:

答案 0 :(得分:0)

天真的方法是聚合。这似乎可以满足您的要求:

select min(_timestamp), max(_timestamp), throughput,
       datediff(day, min(_timestamp), max(_timestamp)) as period_in_min
from t
group by througput;

但是,您可能希望将此视为“空白与孤岛”问题。也就是说,0值可能显示为“ islands”,并且您需要在结果集中为每个岛单独放置一行。

如果是这样,则可以使用不同的行号方法:

select min(_timestamp), max(_timestamp), throughput,
       datediff(day, min(_timestamp), max(_timestamp)) as period_in_min
from (select t.*,
             row_number() over (order by _timestamp) as seqnum,
             row_number() over (partition by throughput order by _timestamp) as seqnum_t
      from t
     ) t
group by (seqnum - seqnum_t), througput;

解释它的工作原理有些棘手。但是,如果您查看子查询的结果,则会看到为什么两个行号值之间的差异标识相邻的常数值。

答案 1 :(得分:0)

如果要将日志分为机器运行或停止的时间段,则可以使用以下代码:

app