根据函数结果返回一个函数参数

时间:2013-02-22 21:54:05

标签: tsql

在我的简化示例场景中,我的目标是在给定特定时间戳和构建的情况下返回最接近70度的传感器温度(称为“TemperatureOfRecord”)。例如,建筑物#1的TemperatureOfRecord在上午8点的时间戳为65度,因为65度接近70度而不是80度。 “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

1 个答案:

答案 0 :(得分: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