【问题标题】:Record events if values have changed in the last 3 days如果值在过去 3 天内发生变化,则记录事件
【发布时间】:2020-03-03 08:49:55
【问题描述】:

我有一个问题,我有一个重要性表。但是这些值之间的差异是 3 天。

select 
    er.name,
    er.temp as real_temp, 
    der.temp as old_temp
from TEMPR_SILO er
    left join TEMPR_SILO der
    on er.name = der.name
where der.ID_TRANS in (select max(ID_TRANS) - 72 from TEMPR_SILO) 
    and er.ID_TRANS  in (select max(ID_TRANS) from TEMPR_SILO)
我的答案
NAME	      REAL_TEMP	OLD_TEMP
SENSOR0001	7.98	    9.66
SENSOR0002	8.04	    9.91
SENSOR0003	7.91	    0.41
SENSOR0004	9.54	   -0.27
SENSOR0005	9.85	   -1.09
SENSOR0006	9.35	   -1.59
SENSOR0007	8.54	   -1.34

也就是说,在答案中我有传感器的名称,并且温度是真实且旧的,已经 3 天了。我有一个问题,如果温度降到 5 度,我是否可以这样做,然后我有一个备用的 ALARM 表,

 INSERT INTO ALARM ( NAME, INFO)    VALUES ( er.name ,'The temperature has greatly changed')
该表将始终有 600 个值。谢谢您的帮助) 我想在每小时调用一次的后台任务中实现此代码)

【问题讨论】:

  • WHERE 子句中的 der 条件使得 LEFT JOIN 返回常规的 INNER JOIN 结果。如果您想要真正的 LEFT JOIN 结果,请将该条件移至 ON 子句。
  • @jarlh 是的,我明白这一点,但 ID_TRANS 每小时增加 1。所以我使用 where。答案是真的!
  • 然后切换到 INNER JOIN,让包括我在内的所有人的代码更清晰。

标签: sql oracle oracle11g


【解决方案1】:

您可以在后台任务中添加以下查询以达到目的。

INSERT INTO IMS.ALARM (NAME,INFO)  
select er.name,'The temperature has significantly dropped'
from IMS.TEMPR_SILO er
    left join IMS.TEMPR_SILO der on er.name = der.name
where der.ID_TRANS in (select max(ID_TRANS) - 72 from IMS.TEMPR_SILO) 
and er.ID_TRANS  in (select max(ID_TRANS) from IMS.TEMPR_SILO)
and der.temp-er.temp>=6;

在我看来,如果您在触发器中管理警报内容而不是某些后台进程,则您的解决方案可能会有所改进,因为这种方式存在一些缺点,例如

  • 另外,连续后台进程将每小时执行一次额外的 DB I/O 消耗处理能力

  • 出于任何给定原因,如果没有出现新记录,则程序可能会根据过时数据注册/插入新警报

但是,如果您使用上述查询在同一表 TEMPR_SILO 上编写触发器“ON INSERT”事件,则:

  • 插入新记录时会自动执行
  • 可以避免误报
  • 不需要后台进程

我希望这个解决方案对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2017-09-23
    • 2016-12-08
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多