在MySQL查询中检查连续值

在MySQL查询中检查连续值,mysql,Mysql,我有一个MySQL表,如下所示: ID - Time - Value SELECT ID, Time FROM mydb.MYTABLE WHERE Value>%s AND Time>=%s AND Time<=%s GROUP BY ID 10 - is a threshold 0 - minimum of the time period 100000 - maximum of the time period select ID, min(Time) from (

我有一个MySQL表,如下所示:

ID - Time - Value
SELECT ID, Time FROM mydb.MYTABLE
WHERE Value>%s AND Time>=%s AND Time<=%s
GROUP BY ID
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
我得到每一对ID,时间按ID分组,值大于某个阈值。基本上,我得到的每个ID的值至少是阈值的一倍。查询如下所示:

ID - Time - Value
SELECT ID, Time FROM mydb.MYTABLE
WHERE Value>%s AND Time>=%s AND Time<=%s
GROUP BY ID
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
在此示例中,只有ID 3应为有效报警,因为此ID的两个连续时间值的值均大于阈值。ID 1有一个单独的、隔离的报警,因此它应该是过滤器。对于ID 2,有2个报警,但不是连续的,因此也应该对其进行过滤。

这样的报警

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的连续时间值的值大于阈值。ID 1 有一个单独的、隔离的报警,所以它应该是过滤器。那里有身份证2 有两个报警,但不是连续的,因此也应进行过滤

我猜您需要筛选警报:

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

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的连续时间值的值大于阈值。ID 1 有一个单独的、隔离的报警,所以它应该是过滤器。那里有身份证2 有两个报警,但不是连续的,因此也应进行过滤

我猜您需要筛选警报:

SELECT ID, Time 
FROM mydb.MYTABLE
WHERE Value>%s3 AND Time>=%s2 AND Time<=%s1
GROUP BY ID
having value<%treshold;
大概是这样的:

ID - Time - Value
SELECT ID, Time FROM mydb.MYTABLE
WHERE Value>%s AND Time>=%s AND Time<=%s
GROUP BY ID
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
此查询用于搜索附近的记录

如果您需要按注释中提到的时间+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
大概是这样的:

ID - Time - Value
SELECT ID, Time FROM mydb.MYTABLE
WHERE Value>%s AND Time>=%s AND Time<=%s
GROUP BY ID
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
此查询用于搜索附近的记录

如果您需要按注释中提到的时间+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

您是否有任何样本数据可以让问题更清楚?您的阈值/报警与查询中已有的两个时间参数有何关联,或者您打算对阈值/报警执行什么查询,目前尚不清楚。一个具体的例子可能有助于您是否有任何样本数据使问题更清楚?您的阈值/报警与查询中已有的两个时间参数有何关联,或者您打算对阈值/报警执行什么查询,目前尚不清楚。一个具体的例子可能会有帮助,它不会检查连续的警报,只会检查警报是否发生了多次,对吗?我真的不理解整个表达式,但无论如何,ID 2不应该列为查询输出,因为没有两个连续的警报。只有ID3应该出现,我甚至不需要时间作为输出。这样,例如,如果时间表示分钟,我将进行过滤,以便仅当值超过阈值2分钟时才会发生报警。这就是为什么我要问连续的瞬间事实上,这是问题的一个例子,我将使用每15分钟采集的样本,以秒为单位进行表达,所以连续的条目在900中不同。工作如预期,非常干净,谢谢!现在我对数据库中的数据量有一个问题,所以这个检查需要花费太长的时间。但这是另一个问题。@RomandGz确保在Id、时间和值字段上有索引。这不会检查连续的报警,只会检查报警是否不止一次,对吗?我确实不理解整个表达式,但无论如何,Id 2不应该列为查询输出,因为没有两个连续的警报。只有ID3应该出现,我甚至不需要时间作为输出。这样,例如,如果时间表示分钟,我将进行过滤,以便仅当值超过阈值2分钟时才会发生报警。这就是为什么我要问连续的瞬间事实上,这是问题的一个例子,我将使用每15分钟采集的样本,以秒为单位进行表达,所以连续的条目在900中不同。工作如预期,非常干净,谢谢!现在我对数据库中的数据量有一个问题,所以这个检查需要花费太长的时间。但这是另一个问题。@RomandGz请确保在Id、时间和值字段上有索引。我不明白“时间报警”和“警报激活”在这里是什么意思。你能解释一下吗?我给了你新的collumn alert\u active,你有多少个警报。我认为报警应该按时间触发,所以我将编辑上面的查询来执行关于值collumnI的操作。我不明白什么是时间报警和报警活动。你能解释一下吗?我给了你新的collumn alert\u active,你有多少个警报。我认为警报应该按时间触发,所以我将编辑上面的查询来执行有关值column的操作