Выберите время остановки из записанного ПЛК - PullRequest
1 голос
/ 13 мая 2019
_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 секунд, производительность машины составляет 1500 кг / час, но во время остановки машины производительность будет такой же, как данные выше.

Вопрос в том, что мне нужно, чтобы результат был похож на таблицу ниже

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Если вы хотите сгруппировать ваш журнал по периодам, когда машина работала или остановилась, вы можете использовать следующий код:

SELECT  MIN(_timestamp) AS [From],
            MAX(_timestamp) AS [To],
            DATEDIFF(MINUTE, MIN(_timestamp), MAX(_timestamp)) AS [Period in min],
            (CASE WHEN AVG(throughput_net) > 0 THEN 'Running' ELSE 'Stopped' END) AS [Status]

    FROM (
            SELECT  yourtable.*,
                    ROW_NUMBER() OVER   (ORDER BY _timestamp) AS seqnum,
                    ROW_NUMBER() OVER   ( PARTITION BY (
                                            CASE WHEN throughput_net > 0 THEN 1 ELSE 0 END
                                          )
                                          ORDER BY _timestamp) AS seqnum_t
            FROM yourtable
    ) t

    GROUP BY (seqnum - seqnum_t);
0 голосов
/ 13 мая 2019

Наивным методом является агрегация.Похоже, это делает то, что вы хотите:

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

Однако вы, вероятно, хотите, чтобы это рассматривалось как проблема пробелов и островков.То есть значения 0 могут отображаться как «острова», и вы хотите отдельную строку в наборе результатов для каждого острова.

Если это так, вы можете использовать метод различных номеров строк:

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;

Немного сложно объяснить, как это работает.Однако, если вы посмотрите на результаты подзапроса, вы поймете, почему разница в двух значениях номеров строк определяет соседние значения констант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...