2013-02-22 78 views
1

在我的簡單示例場景中,我的目標是返回最接近70度的傳感器溫度(稱爲「TemperatureOfRecord」),給定特定的時間戳和建築物。例如,對於早上8點的時間戳建立#1的TemperatureOfRecord是65度,因爲65度比80度更接近70度。 「Delta」列是計算列,返回傳感器溫度的絕對值減去70度。我使用差分來測試每個傳感器溫度與70度的目標溫度。根據函數結果返回函數參數

下面的嵌套相關子查詢會返回正確的結果,但我在爲實際場景擴展此方法時遇到了很多問題。因此,我想問問是否有更簡單的方法可以使用。

SELECT 
    tt.TmStamp 
    , tt.Building 
    , tt.Sensor 
    , tt.Temperature 
    , tt.Delta 
    , (SELECT tt2.Temperature 
     FROM dbo.TempTest tt2 
     WHERE tt2.Building = tt.Building 
      AND tt2.TmStamp = tt.TmStamp 
      AND tt2.Delta = 
      (SELECT MIN(tt3.Delta) 
      FROM dbo.TempTest tt3 
      WHERE tt3.Building = tt.Building 
       AND tt3.TmStamp = tt.TmStamp) 
    ) AS TemperatureOfRecord 
FROM dbo.TempTest tt 

以上查詢的結果如下。

enter image description here

回答

0

你可以嘗試使用CTE來代替。 Here's a SQLFiddle too.我已經比較了兩個查詢的執行計劃 - 即使CTE花費更多,它的掃描/讀取量也只有子查詢方法的三分之一。

WITH rec AS (
    SELECT TmStamp, Building, Temperature, ROW_NUMBER() OVER (PARTITION BY TmStamp, Building ORDER BY Delta) AS RowOrder 
    FROM dbo.TempTest 
) 
SELECT 
    tt.TmStamp 
    , tt.Building 
    , tt.Sensor 
    , tt.Temperature 
    , tt.Delta 
    , rec.Temperature AS TemperatureOfRecord 
FROM dbo.TempTest tt 
JOIN rec 
    ON tt.TmStamp = rec.TmStamp AND tt.Building = rec.Building 
WHERE rec.RowOrder = 1 
+0

這樣做的伎倆! @Matt非常感謝。 – MikeyWazz 2013-02-23 23:30:56