在我的简化示例场景中,我的目标是在给定特定时间戳和构建的情况下返回最接近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
以上查询的结果如下。
答案 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