2013-02-22 5 views
1

В моем упрощенном примере сценария моя цель - вернуть температуру датчика (называемую «TemperatureOfRecord»), которая находится ближе всего к 70 градусам, учитывая конкретную метку времени и здание. Например, температура №1 для здания № 1 для отметки времени 8:00 утра составляет 65 градусов, потому что 65 градусов ближе к 70 градусам, чем 80 градусов. Столбец «Дельта» представляет собой вычисленный столбец, который возвращает абсолютное значение температуры датчика минус 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

ответ

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 
+0

Это сделало трюк! Большое спасибо, @Matt. – MikeyWazz

Смежные вопросы