62 lines
2.2 KiB
Plaintext
62 lines
2.2 KiB
Plaintext
WITH range_alarm_events AS (
|
|
SELECT *,
|
|
/* Get the last time this event was active within the given time range*/
|
|
(
|
|
/* Search for the clear event (if exists) for the outer query's active event */
|
|
SELECT MIN(eventtime)
|
|
FROM alarm_events e2
|
|
WHERE e2.eventid = e.eventid /* eventid is unique per alarm instance */
|
|
AND e2.eventtime >= e.eventtime
|
|
AND e2.eventtype = 1 /* Look only for the clear event */
|
|
ORDER BY eventtime ASC
|
|
LIMIT 1
|
|
) AS endtime
|
|
FROM alarm_events e
|
|
/* The range for both start/end allows for index optimizations */
|
|
WHERE eventtime BETWEEN :startDate AND :endDate
|
|
/* Filter out system events */
|
|
AND eventflags & 1 != 1
|
|
/* Filter priority */
|
|
AND priority >= :priority
|
|
/* Filter for Active events */
|
|
AND eventtype = 0
|
|
ORDER BY eventtime DESC
|
|
LIMIT 2000
|
|
), range_alarm_events2 AS (
|
|
SELECT *,
|
|
LEAST(COALESCE(endtime, NOW()), :endDate) AS endtime_est, /* Clamp to end of time range if clear event is after end time */
|
|
TIMESTAMPDIFF(SECOND, eventtime, LEAST(COALESCE(endtime, NOW()), :endDate)) AS duration
|
|
FROM range_alarm_events
|
|
)
|
|
SELECT e.id,
|
|
e.eventtime AS starttime, e.endtime,
|
|
/* Translate duration to a string */
|
|
CAST(SEC_TO_TIME(FLOOR(e.duration)) AS CHAR) AS duration,
|
|
/* Retrieve data */
|
|
ddevice.strvalue AS device,
|
|
displaypath AS description,
|
|
e.source,
|
|
/* Translate priority to string */
|
|
dclass.strvalue AS class,
|
|
CASE
|
|
WHEN e.priority=4 THEN "Critical"
|
|
WHEN e.priority=3 THEN "High"
|
|
WHEN e.priority=2 THEN "Medium"
|
|
WHEN e.priority=1 THEN "Low"
|
|
WHEN e.priority=0 THEN "Diagnostic"
|
|
ELSE "N/A"
|
|
END AS priority,
|
|
/* Retrieve PLCTag */
|
|
dtag.strvalue AS plctag
|
|
FROM range_alarm_events2 e
|
|
/* Lookup PLCTag */
|
|
JOIN alarm_event_data dtag ON e.id = dtag.id AND dtag.propname = "PLCTag"
|
|
/* Lookup Device */
|
|
JOIN alarm_event_data ddevice ON e.id = ddevice.id AND ddevice.propname = "Device"
|
|
/* Lookup Class */
|
|
JOIN alarm_event_data dclass ON e.id = dclass.id AND dclass.propname = "Class"
|
|
WHERE CASE
|
|
WHEN dclass.strvalue = "Error" THEN 2
|
|
WHEN dclass.strvalue = "Warning" THEN 1
|
|
WHEN dclass.strvalue = "Message" THEN 0
|
|
END >= :class; |