Обновить timeBasedReport.sql
изменение времени окончания суток на 24:00:00 Мелкие правки кода
This commit is contained in:
+76
-64
@@ -11,12 +11,12 @@ WITH
|
|||||||
-- 1. Получаем все проверки ICMP за период
|
-- 1. Получаем все проверки ICMP за период
|
||||||
checks AS (
|
checks AS (
|
||||||
SELECT
|
SELECT
|
||||||
h.host AS "Устройство",
|
h.host AS host_name,
|
||||||
COALESCE(h.name, h.host) AS "Видимое имя",
|
COALESCE(h.name, h.host) AS visible_name,
|
||||||
-- Тип оборудования из инвентаризации (поле type), если пусто - берем hardware
|
-- Тип оборудования из инвентаризации (поле type), если пусто - берем hardware
|
||||||
COALESCE(hinv."name", 'не указан') AS "Тип оборудования",
|
COALESCE(hinv."name", 'не указан') AS equipment_type,
|
||||||
-- Номер объекта ИТС РО (храним в поле notes инвентаризации)
|
-- Номер объекта ИТС РО (храним в поле notes инвентаризации)
|
||||||
COALESCE(hinv.notes, '') AS "Номер_объекта_ИТС_РО",
|
COALESCE(hinv.notes, '') AS object_number,
|
||||||
-- Координаты: объединяем широту и долготу через пробел
|
-- Координаты: объединяем широту и долготу через пробел
|
||||||
CASE
|
CASE
|
||||||
WHEN hinv.location_lat IS NOT NULL AND hinv.location_lon IS NOT NULL
|
WHEN hinv.location_lat IS NOT NULL AND hinv.location_lon IS NOT NULL
|
||||||
@@ -27,11 +27,11 @@ checks AS (
|
|||||||
WHEN hinv.location_lon IS NOT NULL AND hinv.location_lon != ''
|
WHEN hinv.location_lon IS NOT NULL AND hinv.location_lon != ''
|
||||||
THEN hinv.location_lon
|
THEN hinv.location_lon
|
||||||
ELSE ''
|
ELSE ''
|
||||||
END AS "Координаты_расположения",
|
END AS coordinates,
|
||||||
-- Время проверки с учетом часового пояса
|
-- Время проверки с учетом часового пояса
|
||||||
TO_TIMESTAMP(hx.clock) AT TIME ZONE 'Europe/Moscow' AS "ts",
|
TO_TIMESTAMP(hx.clock) AT TIME ZONE 'Europe/Moscow' AS ts,
|
||||||
-- Статус: 1 = доступно, 0 = недоступно
|
-- Статус: 1 = доступно, 0 = недоступно
|
||||||
hx.value AS "status"
|
hx.value AS status
|
||||||
FROM hosts h
|
FROM hosts h
|
||||||
INNER JOIN items i
|
INNER JOIN items i
|
||||||
ON i.hostid = h.hostid
|
ON i.hostid = h.hostid
|
||||||
@@ -49,100 +49,112 @@ checks AS (
|
|||||||
--AND UPPER(h.host) NOT LIKE 'IRZ%'
|
--AND UPPER(h.host) NOT LIKE 'IRZ%'
|
||||||
-- Период: май 2026 года (измените под свои даты)
|
-- Период: май 2026 года (измените под свои даты)
|
||||||
--and hinv.notes = 'ОБЪЕКТ № 12'
|
--and hinv.notes = 'ОБЪЕКТ № 12'
|
||||||
--and hinv."name" = 'Метеостанция Кондор'
|
--and hinv."name" = 'Видеокамера Trassir TR-D6254IR15'
|
||||||
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)
|
between 1 and 85-- (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-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')
|
--AND hx.clock < EXTRACT(EPOCH FROM TIMESTAMP '2026-06-05 00:00:00')
|
||||||
|
AND TO_TIMESTAMP(hx.clock) >= to_date(${start_dt}, 'yyyymmdd') - interval '1 day'
|
||||||
|
AND TO_TIMESTAMP(hx.clock) <= to_date(${end_dt}, 'yyyymmdd') + interval '1 day'
|
||||||
|
|
||||||
),
|
),
|
||||||
|
|
||||||
-- 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 host_name ORDER BY ts) AS prev_status,
|
||||||
Lead("ts") OVER (PARTITION BY "Устройство" ORDER BY "ts")-interval '1 sec' AS "next_ts"
|
coalesce(lead(ts) OVER (PARTITION BY host_name ORDER BY ts), date_trunc('day', ts) + interval '1 day - 1 sec') AS next_ts
|
||||||
FROM checks
|
FROM checks
|
||||||
),
|
),
|
||||||
|
--select * from (
|
||||||
-- 3. Определяем моменты смены статуса (начало нового интервала)
|
-- 3. Определяем моменты смены статуса (начало нового интервала)
|
||||||
status_changes AS (
|
status_changes AS (
|
||||||
SELECT
|
SELECT
|
||||||
"Устройство",
|
host_name,
|
||||||
"Видимое имя",
|
visible_name,
|
||||||
"Тип оборудования",
|
equipment_type,
|
||||||
"Номер_объекта_ИТС_РО",
|
object_number,
|
||||||
"Координаты_расположения",
|
coordinates,
|
||||||
"ts",
|
ts,
|
||||||
"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', ts) + interval '23:59:59'
|
||||||
else "next_ts"
|
else next_ts - interval '1 sec'
|
||||||
end as "next_ts",
|
end as next_ts,
|
||||||
CASE
|
CASE WHEN 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,
|
||||||
|
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
|
||||||
"Устройство",
|
host_name,
|
||||||
"Видимое имя",
|
visible_name,
|
||||||
"Тип оборудования",
|
equipment_type,
|
||||||
"Номер_объекта_ИТС_РО",
|
object_number,
|
||||||
"Координаты_расположения",
|
coordinates,
|
||||||
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",
|
next_ts - interval '1 sec',
|
||||||
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")
|
where DATE(next_ts) > DATE(ts) --)f where status != prev_status and date_trunc('sec', ts) = date_trunc('sec', next_ts)
|
||||||
),
|
),
|
||||||
|
|
||||||
-- 4. Нумеруем интервалы для каждого устройства
|
-- 4. Нумеруем интервалы для каждого устройства
|
||||||
intervals AS (
|
intervals AS (
|
||||||
SELECT
|
SELECT
|
||||||
*,
|
*,
|
||||||
SUM("is_start") OVER (PARTITION BY "Устройство" ORDER BY "ts") AS "interval_id"
|
SUM(is_start) OVER (PARTITION BY host_name ORDER BY ts) AS interval_id
|
||||||
FROM status_changes
|
FROM status_changes
|
||||||
WHERE "status" IS NOT NULL
|
WHERE status IS NOT null
|
||||||
|
and date_trunc('day', ts) >= to_date(${start_dt}, 'yyyymmdd') and date_trunc('day', ts) <= to_date(${end_dt}, 'yyyymmdd')
|
||||||
),
|
),
|
||||||
|
|
||||||
-- 5. Агрегируем каждый непрерывный интервал
|
-- 5. Агрегируем каждый непрерывный интервал
|
||||||
grouped_intervals AS (
|
grouped_intervals AS (
|
||||||
SELECT
|
SELECT
|
||||||
"Устройство",
|
host_name,
|
||||||
"Видимое имя",
|
visible_name,
|
||||||
"Тип оборудования",
|
equipment_type,
|
||||||
"Номер_объекта_ИТС_РО",
|
object_number,
|
||||||
"Координаты_расположения",
|
coordinates,
|
||||||
MIN("ts") AS "time_start",
|
max(case when object_number similar to '%№%' then regexp_replace(object_number, 'ОБЪЕКТ №\s*', '', 'g')::int else null end) as object_num,
|
||||||
MAX("next_ts") AS "time_end",
|
MIN(ts) AS time_start,
|
||||||
MAX("status") AS "status"
|
MAX(next_ts) AS time_end,
|
||||||
|
MAX(status) AS status,
|
||||||
|
MAX(is_24hh) AS is_24hh
|
||||||
FROM intervals
|
FROM intervals
|
||||||
GROUP BY
|
GROUP BY
|
||||||
"Устройство",
|
host_name,
|
||||||
"Видимое имя",
|
visible_name,
|
||||||
"Тип оборудования",
|
equipment_type,
|
||||||
"Номер_объекта_ИТС_РО",
|
object_number,
|
||||||
"Координаты_расположения",
|
coordinates,
|
||||||
"interval_id"
|
interval_id
|
||||||
)
|
)
|
||||||
|
|
||||||
-- 6. Финальный вывод отчета
|
-- 6. Финальный вывод отчета
|
||||||
SELECT
|
SELECT
|
||||||
ROW_NUMBER() OVER (order by "Номер_объекта_ИТС_РО","Тип оборудования","time_start") AS "№ п/п",
|
ROW_NUMBER() OVER (order by object_num nulls last, equipment_type,time_start) AS "№ п/п",
|
||||||
TO_CHAR(DATE("time_start"), 'DD.MM.YYYY') AS "Дата",
|
TO_CHAR(DATE(time_start), 'DD.MM.YYYY') AS "Дата",
|
||||||
"Тип оборудования",
|
equipment_type as "Тип оборудования",
|
||||||
"Номер_объекта_ИТС_РО",
|
case when object_num is null then 'на инвентаризации' else object_number end as "Номер_объекта_ИТС_РО",
|
||||||
"Координаты_расположения",
|
coordinates as "Координаты_расположения",
|
||||||
TO_CHAR("time_start", 'HH24:MI:SS') AS "Время начала статуса",
|
TO_CHAR(time_start, 'yyyy-mm-dd HH24:MI:SS')::varchar AS "Время начала статуса",
|
||||||
TO_CHAR("time_end", 'HH24:MI:SS') AS "Время окончания статуса",
|
case when is_24hh = 1 then TO_CHAR(DATE(time_end), 'yyyy-mm-dd')::varchar || ' 24:00:00'
|
||||||
|
else time_end::varchar end as "Время окончания статуса",
|
||||||
CASE
|
CASE
|
||||||
WHEN "status" = 1 THEN 'доступно'
|
WHEN status = 1 THEN 'доступно'
|
||||||
ELSE 'недоступно'
|
ELSE 'недоступно'
|
||||||
END AS "Статус"
|
END AS "Статус"
|
||||||
FROM grouped_intervals
|
FROM grouped_intervals
|
||||||
ORDER BY 4,3,2;
|
ORDER BY 1
|
||||||
|
;
|
||||||
Reference in New Issue
Block a user