2013-02-22 79 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