#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». в любом случае, я надеюсь, что нам придется это игнорировать .