Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Выборка периодов времени из trends_data  (Прочитано 297 раз)

iww70

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Доброго дня!
Подскажите как правильно сделать выборку из trends_data sql запросом типа всех период работы т.е. от Value=1 и до Value =0 отрезок времени мне надо получить без сложения всех периодов
Стандарт:
Код
ID | Timestamp               | Value    | Quality
1  | 2025-01-23 09:12:00.676 | 1        | 1
1  | 2025-01-23 09:12:10.676 | 1        | 1
1  | 2025-01-23 09:12:20.676 | 1        | 1
1  | 2025-01-23 09:12:30.676 | 0        | 1
1  | 2025-01-23 09:12:31.676 | 0        | 1
1  | 2025-01-23 09:12:32.676 | 1        | 1
1  | 2025-01-23 09:12:34.676 | 1        | 1
1  | 2025-01-23 09:12:35.676 | 1        | 1
1  | 2025-01-23 09:12:36.676 | 1        | 1
1  | 2025-01-23 09:12:37.676 | 1        | 1
1  | 2025-01-23 09:12:40.676 | 0        | 1
1  | 2025-01-23 09:12:41.676 | 0        | 1
1  | 2025-01-23 09:12:42.676 | 0        | 1

Получить типа
Код
ID | time1                   | time2                         |  Value1    | Value2
1  | 2025-01-23 09:12:00.676 | 2025-01-23 09:12:30.676       | 1          | 0
1  | 2025-01-23 09:12:32.676 | 2025-01-23 09:12:40.676       | 1          | 0
« Изменён: 27 Января 2025, 17:02:38 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Выборка периодов времени из trends_data
« Ответ #1 : 28 Января 2025, 23:16:14 »
   Здравствуйте.

 Можно получить выборку последовательным выполнением трёх запросов для временных общих табличных выражений с использованием оконных функций выбора предыдущего/последующего значений LAG и LEAD:
- выделение переходов значений value с фильтрацией по идентификатору переменной id и, возможно, по интервалу времени для timestamp. Поиск начинается с перехода 0->1, для первой строки в качестве предыдущего значения выбирается 0:

SELECT id,timestamp AS time1,value AS value1,LAG(value,1,0) OVER() AS value2 FROM trends_data WHERE id=1;

- формирование временных интервалов для значений value=1 и value=0:

WITH ttemp1 AS (SELECT id,timestamp AS time1,value AS value1,LAG(value,1,0) OVER() AS value2 FROM trends_data WHERE id=1) SELECT id,time1,LEAD(time1,1,' ещё не завершен') OVER() AS time2,value1,value2 FROM ttemp1 WHERE value1<>value2;

- прореживание интервалов только для значений value=1:

WITH ttemp2 AS (WITH ttemp1 AS (SELECT id,timestamp AS time1,value AS value1,LAG(value,1,0) OVER() AS value2 FROM trends_data WHERE id=1) SELECT id,time1,LEAD(time1,1,' ещё не завершен') OVER() AS time2,value1,value2 FROM ttemp1 WHERE value1<>value2) SELECT * FROM ttemp2 WHERE value1=1;


iww70

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Выборка периодов времени из trends_data
« Ответ #2 : 29 Января 2025, 05:08:14 »
Спасибо! а то эти острова мне в новинку!