在MySQL查询中检查连续值

时间:2013-07-25 10:23:24

标签: mysql

我有一个像这样的MySQL表:

ID - Time - Value

我得到每一对ID,时间(按ID分组),其中Value大于某个阈值。所以基本上,我得到的每个ID至少有一次值大于阈值。查询如下所示:

SELECT ID, Time FROM mydb.MYTABLE
WHERE Value>%s AND Time>=%s AND Time<=%s
GROUP BY ID

编辑:时间检查允许在我选择的时间范围内操作表格中的所有数据;它与我所要求的没有任何关系。

它工作得很好,但现在我想添加一些过滤:我希望它避免那些值大于阈值的时间(让我们称之为警报)如果警报还没有发生也只是之前的时间或只是后。我的意思是:如果闹钟在一个孤立的时刻而不是两个连续的时间段内accu,,我会认为这是一个误报并避免在查询响应中返回。

当然,我可以通过调用每个Id来检查这个,但我想在一个查询中执行此操作以使其更快。我想我可以使用条件,但我没有MySQL的专业知识。

任何帮助?

EDIT2:阈值的示例= 10

ID - Time - Value
1  - 2004 -   9
1  - 2005 -  11
1  - 2006 -   8
2  - 2107 -  12
2  - 2109 -  13
3  - 3402 -  11
3  - 3403 -  12

在此示例中,只有ID 3应该是有效警报,因为此ID的2个连续时间值的值>&gt;阈。 ID 1有一个单独的隔离警报,所以它应该是filteres。对于ID 2,有2个警报,但不是连续的,所以它也应该被过滤。

2 个答案:

答案 0 :(得分:1)

这样的事情:

10 - is a threshold
0 - minimum of the time period
100000 - maximum of the time period


select ID, min(Time)

from
(
SELECT ID, Time,

       (select max(time) from t 
           where Time<t1.Time
           and Id=t1.Id
           and Value>10) LAG_G,
       (select max(time) from t 
           where Time<t1.Time
           and Id=t1.Id
           and Value<=10) LAG_L,
       (select min(time) from t 
           where Time>t1.Time
           and Id=t1.Id
           and Value>10) LEAD_G,
       (select min(time) from t 
           where Time>t1.Time
           and Id=t1.Id
           and Value<=10) LEAD_L

FROM t as t1
WHERE Value>10 AND Time>=0 AND Time<=100000
) t3
where ifnull(LAG_G,0)>ifnull(LAG_L,0)
      OR
      ifnull(LEAD_G,100000)<ifnull(LEAD_L,100000)

GROUP BY ID

SQLFiddle demo

此查询适用于搜索附近的记录。

如果您需要按照评论中提到的时间(+ 1,-1)搜索记录,请尝试以下查询:

select ID, min(Time) from t as t1
where Value>10
      AND Time>=%s2 AND Time<=%s1
  and 
   ( 
      Exists(select 1 from t where Value>10 
                              and Id=t1.Id
                              and Time=t1.Time-1) 
      OR 

      Exists(select 1 from t where Value>10 
                              and Id=t1.Id
                              and Time=t1.Time+1) 
   )  
group by ID

SQLFiddle demo

答案 1 :(得分:0)

这样的警报?

SELECT ID, Time , count(if(value>%treshold ,1,0)) alert_active
FROM mydb.MYTABLE
WHERE Value>%s3 AND Time>=%s2 AND Time<=%s1
GROUP BY ID;

我完全不明白:

  

在此示例中,只有ID 3应该是有效警报,因为2   该ID的连续时间值的值> gt;阈。 ID 1   有一个单独的,孤立的警报,所以它应该是filteres。对于ID 2那里   是2个警报,但不是连续的,所以它也应该被过滤。

我想你想要过滤警报:

SELECT ID, Time 
FROM mydb.MYTABLE
WHERE Value>%s3 AND Time>=%s2 AND Time<=%s1
GROUP BY ID
having value<%treshold;