我有一个像这样的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个警报,但不是连续的,所以它也应该被过滤。
答案 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
此查询适用于搜索附近的记录。
如果您需要按照评论中提到的时间(+ 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
答案 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;