【问题标题】:MySQL query for check alerts during a timelapse and conditionMySQL 查询时间间隔和条件期间的检查警报
【发布时间】:2014-01-14 20:39:02
【问题描述】:

你好,我有下一张桌子:

EventID     datetime                        value
1           2012-12-15 12:45:06             15.3
2           2012-12-15 13:00:06             16.9
3           2012-12-15 13:15:06             17.3
4           2012-12-15 13:30:06             16.9
5           2012-12-15 13:45:06             18.8
6           2012-12-15 14:00:06             21.3
7           2012-12-15 14:15:06             21.9
9           2012-12-15 14:30:06             22.7
10          2012-12-15 14:45:06             23.2
11          2012-12-15 15:00:06             23.6

条件是:

value>=15value<=20 并且此条件必须持续一小时或更长时间

对于这组数据,查询必须显示(count):

1

alert,对应事件ID1, 2, 3, 4, 5

我尝试:

select * from events where value>=15 and value<=20

但我不知道如何检测一小时的连续范围。

提前致谢。

【问题讨论】:

  • 您无法从 SQL 可靠地执行此操作。用 PHP 或 C# 等编程语言抓取相关结果并检测那里的连续性。
  • @Mihai,一样,不行
  • 不连续@Mihai
  • 这是一个复杂且相当昂贵的查询。您是否考虑过使用触发器?
  • @TonyHopkinson 是的,但同样的问题,我必须记住条件开始的第一次,并检查接下来的 15 分钟是否进入间隔。

标签: mysql sql datetime date-range


【解决方案1】:

试试这个方法

SELECT COUNT(*) total
  FROM
(
  SELECT 1
    FROM
  (
    SELECT *, 
           @n := @n + 1 rnum, 
           @g := IF(value BETWEEN 15 AND 20, @g + 1, 1) grnum, 
           @p := value
      FROM table1 CROSS JOIN (SELECT @n := 0, @p := NULL, @g := 0) i
     ORDER BY datetime
  ) q
   GROUP BY rnum - grnum
  HAVING COUNT(*) >= 5
     AND TIMESTAMPDIFF(HOUR, MIN(datetime), MAX(datetime)) >= 1
) p

输出:

|总计 | |-------| | 1 |

这里是SQLFiddle演示

【讨论】:

    【解决方案2】:

    使用触发器的解决方案

    假设您在事件表中插入并且始终在当前并且只有一个进程在执行此操作。

    如果你创建了一个名为 say transitions 的表

    TransitionID StartTime, EndTime
    

    然后在事件表上的插入触发器中

    If the value >= 15 and <= 20
      If the Transitions table is empty or the last record has an endtime 
      create a new record with the startTime of the event
    
    If the value < 15 or > 20
      if the Transitions table is not empty and the last record has no endtime
        if an hour has passed update the endtime 
        if it hasn't delete the last transition record
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2012-09-14
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多