Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: iww70 от 27 Января 2025, 13:24:52

Название: Выборка периодов времени из trends_data
Отправлено: iww70 от 27 Января 2025, 13:24:52
Доброго дня!
Подскажите как правильно сделать выборку из 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
Название: Re: Выборка периодов времени из trends_data
Отправлено: pan2000 от 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;

Название: Re: Выборка периодов времени из trends_data
Отправлено: iww70 от 29 Января 2025, 05:08:14
Спасибо! а то эти острова мне в новинку!