1

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

上述查询的结果如下。

在此处输入图像描述

4

1 回答 1

0

您可以尝试改用 CTE。这也是一个 SQLFiddle。我也比较了这两个查询的执行计划——尽管 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
于 2013-02-22T22:22:59.693 回答