2009-11-13 166 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

您發佈的第一部分幫助了很多。我也會嘗試下一部分。 再次感謝 –