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