2009-11-13 139 views
0

我有一个包含电动马达数据的表格,格式如下:数据历史查询

DATE(DateTime)|标签名(VARCHAR(50)|缬氨酸(浮点型)|


2009-11-03 17:44:13.000 | Motor_1 | 123.45


2009-11-04 17:44:13.000 | Motor_1 | 124.45


2009-11-05 17:44:13.000 | Motor_1 | 125.45


2009-11-03 17:44:13000 | Motor_2 | 223.45


2009-11-04 17:44:13.000 | Motor_2 | 224.45

每台电机的数据都是每天插入的,因此将会有31台Motor_1和31台电机等。我们这样做是为了让我们能够在控制系统显示屏上进行设计。 我正在使用视图来提取上个月最大值val和上个月最小值val。 这个月的数据也一样。然后我加入两者并计算差异 以获得该月的实际运行小时数。 “Val”是不可重复的 从PLC(控制器)累计。这是我最近几个月查询最大 值:

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  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 

我知道还有更好的办法。最终,我只需要上个月总计和本月总计。任何帮助,将不胜感激。

在此先感谢

回答

0

前两个查询可以作为一个处理。喜欢的东西:

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的交叉产品,但真正把它带到一个单行(或几个中的DUP的情况下)的条件的非存在后续谓词。 - 标记名+小时指标,如果不容易存在将极大地帮助。

==>我感兴趣的反馈,这个查询性能,与实际数据运行。

+0

我认为这是我需要的。我会再测试一下。 万分感谢! –

+0

您发布的第一部分帮助了很多。我也会尝试下一部分。 再次感谢 –