Обновить timeBasedReport.sql
Исправлен баг времени смены статуса, теперь не пропадает минута. Исправлены статусы устройств - если статус более 24 часов, то создается доп строка
This commit is contained in:
+36
-8
@@ -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;
|
||||
Reference in New Issue
Block a user