数据历史查询
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 索引,如果不是现成的,会有很大帮助。
==>我很想获得有关此查询性能的反馈,因为它使用实际数据运行。
【讨论】:
我认为这正是我所需要的。我会再测试一下。谢谢一百万! 您发布的第一部分帮助很大。我也会尝试下一部分。再次感谢以上是关于数据历史查询的主要内容,如果未能解决你的问题,请参考以下文章