Обновить 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
-- =============================================================================
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 "Номер_объекта_ИТС_РО";
ORDER BY 4,3,2;