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