【发布时间】: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