События SQL — временных рядов в пары

#sql #sql-server #tsql

Вопрос:

В таблице SQL каждые вторые теги сигналов тревоги обновляются с ПЛК.

ID тагнаме Удалить ценность дата и время Качество
28 RH.НА ОБМЕН.PROCESS_CYCLE_4 0 1 28-09-2021 17:43:38.767 192
29 RH.НА ОБМЕН.PROCESS_CYCLE_4 0 0 28-09-2021 17:44:01.723 192
30 RH.НА ОБМЕН.PROCESS_CYCLE_5 0 1 28-09-2021 17:44:02.070 192
31 RH.НА ОБМЕН.CYCLE_COMPLETE 0 1 28-09-2021 17:44:07.637 192
32 RH.НА ОБМЕН.PROCESS_CYCLE_5 0 0 28-09-2021 17:44:07.637 192
33 RH.НА ОБМЕН.CYCLE_COMPLETE 0 0 28-09-2021 17:44:35.513 192
34 RH.НА ОБМЕН.PROCESS_CYCLE_1 0 0 28-09-2021 17:44:35.513 192
35 RH.НА ОБМЕН.ALL_GUN_HOME 0 1 28-09-2021 17:44:38.890 192
36 RH.НА ОБМЕН.ALL_GUN_HOME 0 0 28-09-2021 17:46:00.087 192
37 RH.НА ОБМЕН.PROCESS_CYCLE_1 0 1 28-09-2021 17:46:01.710 192

Если бы у меня был чистый набор данных, без пропущенных событий » 1 «(включено) или » 0 » (выключено), я мог бы добиться этого с помощью:

 select tOn.tagname, tOn.datetime StartTime, tOff.datetime EndTime from ( select tagname, datetime,   ROW_NUMBER() Over(Partition by tagname order by datetime) EventID from [brakerh].[dbo].[onchange] where value = 1 ) tOn LEFT JOIN ( select tagname, datetime,   ROW_NUMBER() Over(Partition by tagname order by datetime) EventID from [brakerh].[dbo].[onchange] where value = 0 ) tOff on (tOn.tagname = tOff.tagname and tOn.EventID = tOff.EventID)  
тагнаме время начала время окончания
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:41:00.190 28-09-2021 17:39:57.753
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:44:38.890 28-09-2021 17:42:30.640
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:47:47.537 28-09-2021 17:46:00.087
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:51:04.253
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:52:42.467
RH.НА ОБМЕН.PROCESS_CYCLE_4 28-09-2021 17:58:10.653 28-09-2021 17:56:29.587

Требования К эффективному способу обработки таблицы для достижения моего вывода, который обрабатывает пропущенные события » 0 » / » 1 «(показано как пробел в примере вывода) — я использую SQL Server 2008, поэтому некоторые функции, такие как «задержка», не работают

Комментарии:

1. Обработайте пропущенные события 0/1…Не уверен, что вы можете что-то исправить с помощью этой спецификации. Если у вас есть правильный 1, за которым следует 0, откуда вы знаете, что между ними не отсутствуют две записи?

2. @Джордж Менутис: Мы можем просто проигнорировать этот единственный случай, поскольку он очень редкий. Ситуация 1: если появляется » 1 «и снова появляется» 1 » после многих пропущенных записей, время окончания в любом случае будет равно нулю . Ситуация 2: если » 0 «появляется после многих отсутствующих записей, в этом случае мы сопоставляем последнюю обновленную «1». в любом случае, я надеюсь, что нам придется это игнорировать .