Попытка суммировать общее время между событиями, ГДЕ текущая временная метка должна быть вычтена из следующего - PullRequest
0 голосов
/ 17 апреля 2019

Первый пост. Пожалуйста, будьте добры.

Иметь таблицу БД с «ID», «State» и «TimeStamp». Число «Состояние» представляет текущее состояние машины на моем заводе. 100 = остановлено, 130 = работает, 170 = неисправен и т. д. и т. д. Каждый раз, когда меняется номер состояния, вставляется новая запись. Это хорошо работает и дает мне запись с номером штата и соответствующей отметкой времени. Длительность времени, в течение которого аппарат находился в определенном состоянии, можно определить путем вычитания метки времени для данной записи из метки времени для следующей записи (при изменении состояния).

До сих пор я использовал функцию LEAD, чтобы получить метку времени следующей строки и поместить ее рядом с предыдущей строкой. Визуально это «выглядит» как начало: если бы я вычел два столбца меток времени, я мог бы получить разницу во времени. Если бы у меня была разница, я мог бы СУММАТЬ для каждого экземпляра каждого отдельного номера штата.

SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        [t_stamp],
        LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime 
FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'

В конечном итоге мне нужен отчет с круговой диаграммой. Каждая часть пирога будет представлять совокупное количество времени, в течение которого машина находилась в каждом заданном состоянии. например в состоянии 130 в течение 5 часов 43 минуты, в состоянии 170 в течение 56 минут и т. д. и т. д.

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Вы проделали всю тяжелую работу, теперь можете использовать подзапрос и DATEDIFF, чтобы получить то, что вы хотите:

SELECT  [tbl_tg_machinestate_ndx],
        [Machine_State], DATEDIFF(mi,[t_stamp],NextStateTime) TimeInState
FROM 
(
  SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        [t_stamp],
        LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime 
  FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
  WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'
) SQ
0 голосов
/ 18 апреля 2019

Прежде всего, спасибо всем за быстрый ответ.Действительно полезно!Кстати, я не эксперт по SQL (возможно, просто новичок), поэтому ваша помощь очень ценится.

Код, предложенный Крисом, хорошо работал, чтобы получить общее время для каждой строки.

С кодом от Михаэля у меня возникла небольшая проблема в конце предложения ORDER BY сразу после функции LEAD.

Затем я объединил оба примера кода и заставил их работать.

--my version...
  WITH StateTimes AS
  (
    SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        DATEDIFF(second, [t_stamp], NextStateTime) AS TimeInState
    FROM
      (
      SELECT
            [tbl_tg_machinestate_ndx],
            [Machine_State],
            [t_stamp],
            LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime
      FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
      WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'
      ) SQ --"SQ" denotes the sub-query (in the brackets)
  )
  SELECT
    [Machine_State],
    CumulativeTime = SUM(TimeInState)
  FROM
    StateTimes
  GROUP BY
    [Machine_State]

Еще раз спасибо, ребята!Я уверен, что вы скоро услышите от меня снова ...

0 голосов
/ 17 апреля 2019

И для агрегирования совокупного количества времени на состояние машины:

with a as (
    SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        HowLong = datediff(
            minute,
            [t_stamp],
            LEAD([t_stamp]) OVER (
                ORDER BY
                    [tbl_tg_machinestate_ndx] 
            )
        )
    FROM
        [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
    WHERE
        [t_stamp] BETWEEN '2019-04-17 13:00'
        AND '2019-04-17 14:00'
)
select
    Machine_State,
    CumulativeTime = sum(HowLong)
from
    a
group by
    Machine_State
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...