【问题标题】:Convert Time series Events into Alarm on and Alarm off pair将时间序列事件转换为警报开启和警报关闭对
【发布时间】:2021-03-05 13:43:34
【问题描述】:

我有一个包含安全相关警报和正常设备警报的表格。这些警报正在被记录。桌子看起来像

   Name                        record     Timestamp
S303R2_LS_STN_ATD_SENSOR_ERR    1   19-11-2020 06:22:53
S303R2_LS_STN_ATD_SENSOR_ERR1   1   19-11-2020 06:22:53
S303R2_LS_STN_ATD_SENSOR_ERR    0   19-11-2020 06:22:55
S303R2_LS_STN_ATD_SENSOR_ERR1   0   19-11-2020 06:22:55
S304R2_LS_STN_ATD_SENSOR_ERR    1   19-11-2020 07:05:28
S304R2_LS_STN_ATD_SENSOR_ERR    0   19-11-2020 07:05:30

用于安全相关标签;如果记录=0,报警开启,记录=1,报警关闭(条件1) 用于普通设备标签;如果record=1,报警开启,record=0,报警关闭(条件2)

我想要得到的是

        Name                              intime                   outtime 
    S303R2_LS_STN_ATD_SENSOR_ERR    19-11-2020 06:22:53   19-11-2020 06:22:55
    S303R2_LS_STN_ATD_SENSOR_ERR1   19-11-2020 06:22:53   19-11-2020 06:22:55
    S304R2_LS_STN_ATD_SENSOR_ERR    19-11-2020 07:05:28   19-11-2020 07:05:30
    S302R1_LS_STN_ATD_SENSOR_ERR    19-11-2020 08:07:08   19-11-2020 08:07:15

我有一个普通设备标签的列表。如果此标签名称在列表中可用,则应根据条件 2 形成警报开/关对,否则应根据条件 1 形成警报开/关。

注意:当设备关闭和打开时,这会变得很棘手。所有的装备标签都会被初始化为 0,安全标签被初始化为 1。

附数据集链接:https://drive.google.com/file/d/19NIm_WWJDqSOUDc3O5G9pFW2InsQ4GOT/view

普通装备标签链接:https://drive.google.com/file/d/1UFFT-m4j6xlzKVQk8qjjsrZuQj6jJwSG/view

【问题讨论】:

  • 您使用的是 MS SQL Server 还是 Postgresql?
  • 我需要解决方案,无论我为 MS SQL 还是 posrtgresql 获得它都没有关系。两者都对我有用
  • 然后选择一个,因为两者都使用不同的方言。此外,请不要发布指向 Google 驱动器文件的链接供他人下载;作为专业人士,我们知道从未知来源下载文件的危险。如果信息很重要,请将其包含在问题本身中。

标签: sql sql-server postgresql tsql sql-server-2008


【解决方案1】:

我认为你可以使用LEAD()

WITH ordered_data as
(
   SELECT *
   ,LEAD(td.Timestamp,1,NULL)OVER(PARTITION BY td.Name ORDER by td.Timestamp) next_event
   FROM table_data td
)
--Normal equipment tags
SELECT Name,Timestamp intime, next_event outtime
FROM ordered_data
WHERE record = 1
AND Name IN ('S303R2_LS_STN_ATD_SENSOR_ERR','S303R2_LS_STN_ATD_SENSOR_ERR1') --add all names here or do a subselect if you have the list
UNION 
--safety related tags
SELECT Name,Timestamp intime, next_event outtime
FROM ordered_data
WHERE record = 0
AND Name NOT IN ('S303R2_LS_STN_ATD_SENSOR_ERR','S303R2_LS_STN_ATD_SENSOR_ERR1') --add all names here or do a subselect if you have the list

【讨论】:

  • 如果可能的话,请您解释一下这段代码中发生了什么
  • 是 - LEAD()` 计算每个 td.Name 的下一个时间戳。如果它是一个记录 = 1,它应该是一个记录 = 0,反之亦然。 UNION 上方的部分处理条件 2(正常设备),UNIOn 下方的部分处理条件 1 安全标签...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多