Обновить timeBasedReport.sql

Исправлен баг времени смены статуса, теперь не пропадает минута.
Исправлены статусы устройств - если статус более 24 часов, то создается доп строка
This commit is contained in:
2026-06-25 19:23:46 +00:00
parent 0739a0eca2
commit b46bd84c10
+36 -8
View File
@@ -6,6 +6,7 @@
-- Координаты: широта + долгота из полей location_lat и location_lon -- Координаты: широта + долгота из полей location_lat и location_lon
-- ============================================================================= -- =============================================================================
WITH WITH
-- 1. Получаем все проверки ICMP за период -- 1. Получаем все проверки ICMP за период
checks AS ( checks AS (
@@ -47,30 +48,57 @@ checks AS (
-- Исключаем оборудование, начинающееся на IRZ (любой регистр) -- Исключаем оборудование, начинающееся на IRZ (любой регистр)
--AND UPPER(h.host) NOT LIKE 'IRZ%' --AND UPPER(h.host) NOT LIKE 'IRZ%'
-- Период: май 2026 года (измените под свои даты) -- Период: май 2026 года (измените под свои даты)
--and hinv.notes = 'ОБЪЕКТ № 9' --and hinv.notes = 'ОБЪЕКТ № 12'
--and hinv."name" = 'Метеостанция Кондор'
and CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') as INTEGER) 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) 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. Добавляем предыдущий статус для определения моментов смены -- 2. Добавляем предыдущий статус для определения моментов смены
checks_with_prev AS ( checks_with_prev AS (
SELECT 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 FROM checks
), ),
-- 3. Определяем моменты смены статуса (начало нового интервала) -- 3. Определяем моменты смены статуса (начало нового интервала)
status_changes AS ( status_changes AS (
SELECT 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 CASE
WHEN "prev_status" IS NULL OR "status" != "prev_status" THEN 1 WHEN "prev_status" IS NULL OR "status" != "prev_status" THEN 1
ELSE 0 ELSE 0
END AS "is_start" END AS "is_start"
FROM checks_with_prev 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. Нумеруем интервалы для каждого устройства -- 4. Нумеруем интервалы для каждого устройства
@@ -91,7 +119,7 @@ grouped_intervals AS (
"Номер_объекта_ИТС_РО", "Номер_объекта_ИТС_РО",
"Координаты_расположения", "Координаты_расположения",
MIN("ts") AS "time_start", MIN("ts") AS "time_start",
MAX("ts") AS "time_end", MAX("next_ts") AS "time_end",
MAX("status") AS "status" MAX("status") AS "status"
FROM intervals FROM intervals
GROUP BY GROUP BY
@@ -105,7 +133,7 @@ grouped_intervals AS (
-- 6. Финальный вывод отчета -- 6. Финальный вывод отчета
SELECT 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 "Дата", TO_CHAR(DATE("time_start"), 'DD.MM.YYYY') AS "Дата",
"Тип оборудования", "Тип оборудования",
"Номер_объекта_ИТС_РО", "Номер_объекта_ИТС_РО",
@@ -117,4 +145,4 @@ SELECT
ELSE 'недоступно' ELSE 'недоступно'
END AS "Статус" END AS "Статус"
FROM grouped_intervals FROM grouped_intervals
ORDER BY "Номер_объекта_ИТС_РО"; ORDER BY 4,3,2;