如何在Grafana仪表盘中实现多时序信号的条件判断逻辑?
实现逻辑的两种最优方案
根据你的需求,分别查询A、B、C标签后在Grafana中实现状态计算,推荐以下两种方案:
方案一:Transform + 计算字段(适合可视化前的数据预处理)
调整查询语句:
分别为A、B、C编写SQL查询,确保每个查询返回DateTime和对应标签的数值(重命名列避免冲突),示例:-- 查询标签A的时序数据 SET NOCOUNT ON DECLARE @StartDate DateTime DECLARE @EndDate DateTime SET @StartDate = DateAdd(mi,-5,GetDate()) SET @EndDate = GetDate() SET NOCOUNT OFF SELECT DateTime, Value AS A_Value FROM ( SELECT History.TagName, DateTime, Value, vValue, StartDateTime FROM History WHERE History.TagName IN ('A') AND wwRetrievalMode = 'Cyclic' AND wwCycleCount = 100 AND wwVersion = 'Latest' AND DateTime >= @StartDate AND DateTime <= @EndDate) temp WHERE temp.StartDateTime >= @StartDate同理修改B、C的查询,分别返回
DateTime, B_Value和DateTime, C_Value。合并时序数据:
在Grafana的Transform面板中,添加Merge转换,将三个查询的结果按DateTime字段合并,生成包含DateTime、A_Value、B_Value、C_Value的统一数据集。添加计算字段实现逻辑:
继续添加Add field from calculation转换,设置:- 字段名称:
Status - 表达式:
if($A_Value > 0, if($B_Value > $C_Value, 1, 0), 0)
该表达式会逐行计算状态值,完全匹配你需要的逻辑。
- 字段名称:
方案二:Grafana表达式(适合时序数据的实时计算)
如果你的数据是标准时序格式(带时间戳的数值序列),可以直接用Grafana的表达式功能实现逐点计算:
- 创建三个查询分别获取A、B、C的时序数据,记下每个查询的ID(比如Q0、Q1、Q2)。
- 新增一个Expression查询,输入以下表达式:
这里$Q0 > 0 and $Q1 > $Q2 ? 1 : 0$Q0、$Q1、$Q2对应A、B、C的查询ID,表达式会自动对齐三个时序的时间戳,逐点输出状态值。
额外优化:SQL层面直接计算(性能更优)
如果允许在SQL中一次性处理,推荐用CTE关联三个标签的数据,直接计算Status,减少Grafana端的处理压力:
SET NOCOUNT ON DECLARE @StartDate DateTime DECLARE @EndDate DateTime SET @StartDate = DateAdd(mi,-5,GetDate()) SET @EndDate = GetDate() SET NOCOUNT OFF WITH TagA AS ( SELECT DateTime, Value AS A_Value FROM ( SELECT DateTime, Value, StartDateTime FROM History WHERE TagName = 'A' AND wwRetrievalMode = 'Cyclic' AND wwCycleCount = 100 AND wwVersion = 'Latest' AND DateTime >= @StartDate AND DateTime <= @EndDate ) temp WHERE temp.StartDateTime >= @StartDate ), TagB AS ( SELECT DateTime, Value AS B_Value FROM ( SELECT DateTime, Value, StartDateTime FROM History WHERE TagName = 'B' AND wwRetrievalMode = 'Cyclic' AND wwCycleCount = 100 AND wwVersion = 'Latest' AND DateTime >= @StartDate AND DateTime <= @EndDate ) temp WHERE temp.StartDateTime >= @StartDate ), TagC AS ( SELECT DateTime, Value AS C_Value FROM ( SELECT DateTime, Value, StartDateTime FROM History WHERE TagName = 'C' AND wwRetrievalMode = 'Cyclic' AND wwCycleCount = 100 AND wwVersion = 'Latest' AND DateTime >= @StartDate AND DateTime <= @EndDate ) temp WHERE temp.StartDateTime >= @StartDate ) SELECT COALESCE(a.DateTime, b.DateTime, c.DateTime) AS DateTime, CASE WHEN a.A_Value > 0 AND b.B_Value > c.C_Value THEN 1 ELSE 0 END AS Status FROM TagA a FULL JOIN TagB b ON a.DateTime = b.DateTime FULL JOIN TagC c ON COALESCE(a.DateTime, b.DateTime) = c.DateTime ORDER BY DateTime
内容的提问来源于stack exchange,提问作者Nili
相关产品推荐
相关产品推荐

