我被要求针对以下情况编译SQL查询:
ID | PARAMETER | VALID | VALUE
------------------------------
1 | Event1_Val | 1 | 0
1 | Event2_Val | 0 | 50.00
1 | Event2_Avg | 0 | 55.00
1 | Event1_Avg | 0 | 66.67
2 | Event1_Val | 0 | 37.50
2 | Event2_Val | 1 | 0
2 | Event1_Avg | 0 | 50.00
2 | Event2_Avg | 0 | 66.67
_Val
当前值在哪里。_Avg
是过去五个值的平均值。
要求1:如果VALID == 1
(仅适用于_Val
值),则不要检查该参数的_Val
和_Avg
,而要检查其他参数的_Val
和_Avg
。在上面的示例中ID=1
,Event2_Val
和Event2_Avg
被选中,因为Event1_Val.VALID = 1
(这意味着Event1_Val
并且Event1_Avg
将不被选中。)
条件2:检查的值_Val
和_Avg
作为要求1所述的下列条件的一个结果是:
_Val
<5 OR_Val
+ 10 < _Avg
上面的条件将返回警报。在上面的示例中ID=2
,Event1_Val
由于37.50 + 10小于50.00 ,因此将返回警报。
要求3:说明要求2的结果
ID | PARAMETER | ALERT
------------------------
1 | Event2_Val | 0
2 | Event1_Val | 1
我试图检查VALID
不等于1,但是这给了我以下内容:
ID | PARAMETER | VALID | VALUE
------------------------------
1 | Event2_Val | 0 | 50.00
1 | Event2_Avg | 0 | 55.00
1 | Event1_Avg | 0 | 66.67
2 | Event1_Val | 0 | 37.50
2 | Event1_Avg | 0 | 50.00
2 | Event2_Avg | 0 | 66.67
我不想检查其中的事件的参数_Val.VALID == 1
。意思是,因为ID=1
我不想包括在内Event1_Avg
。
在这种情况下,有没有一种方法可以使用查询对条件进行分组和检查?注意:强烈希望不要更改表中的值。
尝试:
SELECT t1.id,
t1.parameter,
CASE
WHEN (t1.value < 5 OR (t1.value + 10 < t2.value)) THEN 1
ELSE 0
END alert
FROM your_table t1
JOIN your_table t2 ON t1.id = t2.id
AND left(t1.parameter, 6) = left(t2.parameter, 6)
AND t1.parameter LIKE '%_Val'
AND t2.parameter LIKE '%_Avg'
WHERE
t1.valid <> 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句