Обновить timeBasedReport.sql

This commit is contained in:
2026-06-28 21:19:31 +00:00
parent 113864947e
commit 6bf618371f
+10 -18
View File
@@ -1,6 +1,5 @@
-- ============================================================================= -- =============================================================================
-- Отчет повременного учета работоспособности периферийного оборудования -- Отчет повременного учета работоспособности периферийного оборудования
-- Период: май 2026
-- Исключены устройства, начинающиеся на IRZ -- Исключены устройства, начинающиеся на IRZ
-- Тип оборудования берется из инвентаризации Zabbix (поле type) -- Тип оборудования берется из инвентаризации Zabbix (поле type)
-- Координаты: широта + долгота из полей location_lat и location_lon -- Координаты: широта + долгота из полей location_lat и location_lon
@@ -64,10 +63,10 @@ checks_with_prev AS (
SELECT SELECT
*, *,
LAG(status) OVER (PARTITION BY host_name ORDER BY ts) AS prev_status, LAG(status) OVER (PARTITION BY host_name ORDER BY ts) AS prev_status,
coalesce(lead(ts) OVER (PARTITION BY host_name ORDER BY ts), date_trunc('day', ts) + interval '1 day - 1 sec') AS next_ts coalesce(lead(ts) OVER (PARTITION BY host_name ORDER BY ts), date_trunc('day', ts) + interval '1 day') AS next_ts
FROM checks FROM checks
), ),
--select * from (
-- 3. Определяем моменты смены статуса (начало нового интервала) -- 3. Определяем моменты смены статуса (начало нового интервала)
status_changes AS ( status_changes AS (
SELECT SELECT
@@ -80,16 +79,12 @@ status_changes AS (
status, status,
prev_status, prev_status,
case case
when DATE(next_ts) > DATE(ts) then date_trunc('day', ts) + interval '23:59:59' when DATE(next_ts) > DATE(ts) then date_trunc('day', next_ts) + interval '00:00:00'
else next_ts - interval '1 sec' else next_ts - interval '1 sec'
end as next_ts, end as next_ts,
CASE WHEN status != prev_status THEN 1 CASE WHEN status != prev_status THEN 1
ELSE 0 ELSE 0
END AS is_start, END AS is_start
case
when DATE(next_ts) > DATE(ts) then 1
else 0
end as is_24hh
FROM checks_with_prev FROM checks_with_prev
union all union all
SELECT SELECT
@@ -101,11 +96,10 @@ status_changes AS (
date_trunc('day', next_ts) + interval '00:00:00' as ts, date_trunc('day', next_ts) + interval '00:00:00' as ts,
status, status,
prev_status, prev_status,
next_ts - interval '1 sec', next_ts - interval '1 sec' as next_ts,
1 as is_start, 1 as is_start
0 as is_24hh
FROM checks_with_prev FROM checks_with_prev
where DATE(next_ts) > DATE(ts) --)f where status != prev_status and date_trunc('sec', ts) = date_trunc('sec', next_ts) where DATE(next_ts) > DATE(ts)
), ),
-- 4. Нумеруем интервалы для каждого устройства -- 4. Нумеруем интервалы для каждого устройства
@@ -129,8 +123,7 @@ grouped_intervals AS (
max(case when object_number similar to '%№%' then regexp_replace(object_number, 'ОБЪЕКТ №\s*', '', 'g')::int else null end) as object_num, max(case when object_number similar to '%№%' then regexp_replace(object_number, 'ОБЪЕКТ №\s*', '', 'g')::int else null end) as object_num,
MIN(ts) AS time_start, MIN(ts) AS time_start,
MAX(next_ts) AS time_end, MAX(next_ts) AS time_end,
MAX(status) AS status, MAX(status) AS status
MAX(is_24hh) AS is_24hh
FROM intervals FROM intervals
GROUP BY GROUP BY
host_name, host_name,
@@ -148,9 +141,8 @@ SELECT
equipment_type as "Тип оборудования", equipment_type as "Тип оборудования",
case when object_num is null then 'на инвентаризации' else object_number end as "Номер_объекта_ИТС_РО", case when object_num is null then 'на инвентаризации' else object_number end as "Номер_объекта_ИТС_РО",
coordinates as "Координаты_расположения", coordinates as "Координаты_расположения",
TO_CHAR(time_start, 'yyyy-mm-dd HH24:MI:SS')::varchar AS "Время начала статуса", TO_CHAR(time_start, 'HH24:MI:SS') AS "Время начала статуса",
case when is_24hh = 1 then TO_CHAR(DATE(time_end), 'yyyy-mm-dd')::varchar || ' 24:00:00' TO_CHAR(time_end, 'HH24:MI:SS') as "Время окончания статуса",
else time_end::varchar end as "Время окончания статуса",
CASE CASE
WHEN status = 1 THEN 'доступно' WHEN status = 1 THEN 'доступно'
ELSE 'недоступно' ELSE 'недоступно'