diff --git a/timeBasedReport.sql b/timeBasedReport.sql index db9cdbf..d221f12 100644 --- a/timeBasedReport.sql +++ b/timeBasedReport.sql @@ -6,6 +6,7 @@ -- Координаты: широта + долгота из полей location_lat и location_lon -- ============================================================================= + WITH -- 1. Получаем все проверки ICMP за период checks AS ( @@ -47,30 +48,57 @@ checks AS ( -- Исключаем оборудование, начинающееся на IRZ (любой регистр) --AND UPPER(h.host) NOT LIKE 'IRZ%' -- Период: май 2026 года (измените под свои даты) - --and hinv.notes = 'ОБЪЕКТ № 9' + --and hinv.notes = 'ОБЪЕКТ № 12' + --and hinv."name" = 'Метеостанция Кондор' and CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') as INTEGER) in (44,77,43,54,27,48,12,49,65,9,60,35,38,1,51,41,53,84,8) - AND hx.clock >= EXTRACT(EPOCH FROM TIMESTAMP '2026-05-25 00:00:00') - AND hx.clock < EXTRACT(EPOCH FROM TIMESTAMP '2026-06-01 00:00:00') + AND hx.clock >= EXTRACT(EPOCH FROM TIMESTAMP '2026-06-01 00:00:00') + AND hx.clock < EXTRACT(EPOCH FROM TIMESTAMP '2026-07-01 00:00:00') ), -- 2. Добавляем предыдущий статус для определения моментов смены checks_with_prev AS ( SELECT *, - LAG("status") OVER (PARTITION BY "Устройство" ORDER BY "ts") AS "prev_status" + LAG("status") OVER (PARTITION BY "Устройство" ORDER BY "ts") AS "prev_status", + Lead("ts") OVER (PARTITION BY "Устройство" ORDER BY "ts")-interval '1 sec' AS "next_ts" FROM checks ), -- 3. Определяем моменты смены статуса (начало нового интервала) status_changes AS ( SELECT - *, + "Устройство", + "Видимое имя", + "Тип оборудования", + "Номер_объекта_ИТС_РО", + "Координаты_расположения", + "ts", + "status", + "prev_status", + case + when DATE("next_ts") > DATE("ts") then date_trunc('day', "ts") + interval '23:59:59' + else "next_ts" + end as "next_ts", CASE WHEN "prev_status" IS NULL OR "status" != "prev_status" THEN 1 ELSE 0 END AS "is_start" FROM checks_with_prev + union all + SELECT + "Устройство", + "Видимое имя", + "Тип оборудования", + "Номер_объекта_ИТС_РО", + "Координаты_расположения", + date_trunc('day', "next_ts") + interval '00:00:00' as "ts", + "status", + "prev_status", + "next_ts", + 1 as "is_start" + FROM checks_with_prev + where DATE("next_ts") > DATE("ts") ), -- 4. Нумеруем интервалы для каждого устройства @@ -91,7 +119,7 @@ grouped_intervals AS ( "Номер_объекта_ИТС_РО", "Координаты_расположения", MIN("ts") AS "time_start", - MAX("ts") AS "time_end", + MAX("next_ts") AS "time_end", MAX("status") AS "status" FROM intervals GROUP BY @@ -105,7 +133,7 @@ grouped_intervals AS ( -- 6. Финальный вывод отчета SELECT - ROW_NUMBER() OVER (ORDER BY "Устройство", "time_start") AS "№ п/п", + ROW_NUMBER() OVER (order by "Номер_объекта_ИТС_РО","Тип оборудования","time_start") AS "№ п/п", TO_CHAR(DATE("time_start"), 'DD.MM.YYYY') AS "Дата", "Тип оборудования", "Номер_объекта_ИТС_РО", @@ -117,4 +145,4 @@ SELECT ELSE 'недоступно' END AS "Статус" FROM grouped_intervals -ORDER BY "Номер_объекта_ИТС_РО"; \ No newline at end of file +ORDER BY 4,3,2; \ No newline at end of file