数据历史查询

Posted

技术标签:

【中文标题】数据历史查询【英文标题】:Data historian queries 【发布时间】:2009-11-13 16:01:58 【问题描述】:

我有一个包含电动机数据的表格,格式为:

日期(日期时间)| TagName(VarChar(50) | Val(Float) |


2009-11-03 17:44:13.000 |电机_1 | 123.45


2009-11-04 17:44:13.000 |电机_1 | 124.45


2009-11-05 17:44:13.000 |电机_1 | 125.45


2009-11-03 17:44:13.000 |电机_2 | 223.45


2009-11-04 17:44:13.000 |电机_2 | 224.45

每天都会插入每个电机的数据,因此会有 31 个 Motor_1s 和 31 个 Motor_2s 等。我们这样做是为了在我们的控制系统显示器上显示趋势。 我正在使用视图来提取上个月的最大 val 和上个月的最小 val。 本月数据相同。然后我加入两者并计算差异 获取该月的实际运行时间。 “Val”是不可重置的 来自 PLC(控制器)的累积。这是我对上个月 Max 的查询 价值:

SELECT     TagName, Val AS Hours
FROM         dbo.All_Data_From_Last_Mon AS cur
WHERE     (NOT EXISTS
                          (SELECT     TagName, Val
                            FROM          dbo.All_Data_From_Last_Mon AS high
                            WHERE      (TagName = cur.TagName) AND (Val > cur.Val)))

这是我对上个月 Max 的查询 价值:

SELECT     TagName, Val AS Hours
FROM         dbo.All_Data_From_Last_Mon AS cur
WHERE     (NOT EXISTS
                          (SELECT     TagName, Val
                            FROM          dbo.All_Data_From_Last_Mon AS high
                            WHERE      (TagName = cur.TagName) AND (Val < cur.Val)))

这是计算差值的查询,运行速度有点慢:

SELECT  dbo.Motors_Last_Mon_Max.TagName, STR(dbo.Motors_Last_Mon_Max.Hours - dbo.Motors_Last_Mon_Min.Hours, 12, 2) AS Hours
FROM    dbo.Motors_Last_Mon_Min RIGHT OUTER JOIN
            dbo.Motors_Last_Mon_Max ON dbo.Motors_Last_Mon_Min.TagName = dbo.Motors_Last_Mon_Max.TagName

我知道有更好的方法。最终,我只需要最后几个月的总数和本月的总数。任何帮助将不胜感激。

提前致谢

【问题讨论】:

【参考方案1】:

前两个查询可以作为一个处理。比如:

SELECT TagName, MAX(Val) AS MaxVal, MIN(Val) AS MinVal
FROM   dbo.All_Data_From_Last_Mon
GROUP BY TagName
-- ORDER BY TagName  (optionally)

我现在看到这些查询是 SQL 视图,用于第三个查询...我明白为什么这会很慢 ;-) 下面重现了逻辑,但没有视图,这应该允许 SQL 进行相当多的优化。无论如何,它可以更清楚地说明正在做什么... 请“试一试”。

SELECT  DISTINCT Mx.TagName, STR(Mx.Hours - Mn.Hours, 12, 2) AS Hours
FROM  dbo.All_Data_From_Last_Mon Mx
RIGHT OUTER JOIN dbo.All_Data_From_Last_Mon Mn ON Mx.TagName = Mn.TagName
  AND dbo.All_Data_From_Last_Mon  -- Cut the cross product a bit; may not be necessary
WHERE 
      NOT EXISTS (SELECT * FROM dbo.All_Data_From_Last_Mon Mx1 
                  WHERE Mx1.TagName = Mx.TagName AND Mx1.Hours > Mx.Hours)
  AND NOT EXISTS (SELECT * FROM dbo.All_Data_From_Last_Mon Mn1 
                  WHERE Mn1.TagName = Mn.TagName AND Mn1.Hours < Mx.Hours)

注意事项: - 注意 SELECT 语句中的 DISTINCT。这是为了避免重复行,因为在这种情况下会有几天显示该月的最大(或最小)小时值。 - 连接上的额外条件旨在避免完整的 31 * 31 叉积,但真正将其带到单行(或在重复的情况下为多行)的条件是后面的 NON EXISTS 谓词。 - 一个 TagName+Hours 索引,如果不是现成的,会有很大帮助。

==>我很想获得有关此查询性能的反馈,因为它使用实际数据运行。

【讨论】:

我认为这正是我所需要的。我会再测试一下。谢谢一百万! 您发布的第一部分帮助很大。我也会尝试下一部分。再次感谢

以上是关于数据历史查询的主要内容,如果未能解决你的问题,请参考以下文章

如何查看各地历史气象气温数据

数据历史查询

如何查询历史sql

历史数据处理

历史数据处理

如何查询余额历史