【问题标题】:SQL Count Unacknowledged AlarmsSQL 计数未确认的警报
【发布时间】:2021-04-01 14:52:52
【问题描述】:

我希望计算在某个时间范围内激活但未确认的警报数量以及未清除的警报数量。三种类型的事件都存储在同一个表中:警报激活、确认和清除。

我正在查询的表看起来像这样。

ID Alarm Name Event Type Is Active Is Acknowledged Date Time
1 Alarm 1 Acknowledged True True 12/22/2020 06:00:00
2 Alarm 1 Cleared False True 12/22/2020 06:30:00
3 Alarm 2 Active True False 12/22/2020 07:00:00
4 Alarm 3 Active True False 12/22/2020 07:30:00
5 Alarm 2 Acknowledged True True 12/22/2020 08:00:00
6 Alarm 2 Connection Lost True True 12/22/2020 08:30:00
7 Alarm 2 Connection Regained True True 12/22/2020 09:00:00
8 Alarm 3 Cleared False False 12/22/2020 09:30:00
9 Alarm 2 Cleared False True 12/22/2020 10:00:00
10 Alarm 3 Active True False 12/22/2020 10:30:00

此表的结果将是 2 个警报未确认和 1 个警报未清除。 应该忽略前两行,因为初始 Active 事件不在时间范围内。警报 2 激活、确认然后清除。警报 3 激活并在被确认之前被清除。警报 3 再次激活,但没有确认或清除事件。

我不得不对不同的数据库做类似的事情,其中​​同一个警报的每个行事件都有一个 id。在那种情况下,我使用该 ID 将确认事件和清除事件加入到活动事件中,然后计算连接为空的位置。但是在这里,我没有那个警报 ID。我写了一个查询,它会添加一个唯一的 ID。这里是:

SELECT AlarmName,
SUM(CASE WHEN EventType = 'Active' THEN 1 ELSE 0 END) OVER (PARTITION BY AlarmName ORDER BY DateTime) as InstanceID
FROM AllEvent
ORDER BY AlarmName, InstanceID

有什么想法吗?

【问题讨论】:

  • 你试过什么?我们需要看看你的尝试。您可能正在寻找row_number()。 PS 如果您将示例数据添加为 DDL/DML 人员可以更轻松地提供帮助。
  • 您好,对于 DDL/DML,您的意思是要包含一个可以创建表的语句吗?
  • 是的,创建一个临时表,插入一些示例数据......这样就可以让别人复制粘贴并进行测试了。

标签: sql sql-server datetime count gaps-and-islands


【解决方案1】:

对于“Active”>“Acknowledged”>“Cleared”的固定预期序列,您可以使用lead():

select 
    sum(case when lead_event1 = 'Acknowledged' then 0 else 1 end) as cnt_not_ack,
    sum(case when lead_event2 = 'Cleared' then 0 else 1 end) as cnt_not_cleared
from (
    select t.*,
        lead(event_type, 1) over(partition by alarm_name order by date_time) as lead_event1
        lead(event_type, 2) over(partition by alarm_name order by date_time) as lead_event1
    from mytable t
) t
where event_type = 'Active'

对于每一行,lead() 检索相同警报编号的下一个和下一个事件类型)。然后我们可以只过滤“活动”事件,并检查以下事件是否是确认和清除。最后一步是聚合。

【讨论】:

  • 这很聪明!不幸的是,警报可以在清除后得到确认,并且还有一些其他类型的事件,例如与警报的连接丢失。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多