Tsql 基于函数结果返回函数参数

Tsql 基于函数结果返回函数参数,tsql,Tsql,在我的简化示例场景中,我的目标是返回最接近70度的传感器温度(称为“TemperatureOfRecord”),给定特定的时间戳和建筑物。例如,building#1上午8:00时间戳的温度记录为65度,因为65度比80度更接近70度。“Delta”列是一个计算列,返回传感器温度的绝对值减去70度。我使用差速器测试每个传感器的温度与70度的目标温度 下面的嵌套相关子查询返回正确的结果,但是我在扩展这种方法以适应实际场景时遇到了很多困难。因此,我想问,我是否可以使用一种更简单的方法 SELECT

在我的简化示例场景中,我的目标是返回最接近70度的传感器温度(称为“TemperatureOfRecord”),给定特定的时间戳和建筑物。例如,building#1上午8:00时间戳的温度记录为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
下面是上述查询的结果


您可以尝试改用CTE。我还比较了两个查询的执行计划——尽管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