Выберите последнее значение за месяц для всех заданных идентификаторов - PullRequest
2 голосов
/ 21 октября 2010

У меня есть 2 таблицы, одна из которых содержит идентификаторы счетчиков, а другая содержит измерения для некоторых счетчиков в первой таблице.Это структура таблицы:

MeterConfig:

  • MeterID (int)
  • MeterNumber (char [16])
  • Тип (char [25])

Показания:

  • MeterID (int)
  • Дата (дата-время)
  • Значение (числовое (18,6)))

Мне нужно получить последнее значение (и его дату) из заданного периода для каждого счетчика, а также номер счетчика.Мне удалось сделать это в T-SQL, хотя я не особенно доволен тем, как я сделал это, используя этот запрос:

select distinct
 cfg.MeterNumber,
 (select top 1 r.Date from Readings as r where r.Date between @startdate and @endDate and r.MeterID = cfg.MeterID order by r.Date desc) as Date,
 (select top 1 r.Value from Readings as r where r.Date between @startdate and @endDate and r.MeterID = cfg.MeterID order by r.Date desc) as Value
from
 MeterConfig cfg, Readings r1
where cfg.MeterID = r1.MeterID and r1.Date between @startdate and @endDate;

Как я могу сделать это более эффективно?

Ответы [ 2 ]

4 голосов
/ 21 октября 2010
WITH CTE AS (
SELECT mc.MeterID, Date, Value, ROW_NUMBER() OVER (PARTITION BY mc.MeterID ORDER BY Date DESC) as Rank
FROM  MeterConfig mc
INNER JOIN Readings rd
ON mc.MeterID = rd.MeterID
WHERE rd.Date BETWEEN @startdate AND @endDate)
SELECT * FROM CTE WHERE Rank = 1
1 голос
/ 21 октября 2010

Предполагая, что даты в Чтениях являются уникальными (в том числе отметка времени), следующие должны быть эквивалентны вашему запросу.

SELECT  DISTINCT cfg.MeterNumber
        , r1.Date
        , r1.Value         
FROM    MeterConfig cfg
        INNER JOIN Readings r1 ON cfg.MeterID = r1.MeterID 
        INNER JOIN (        
          SELECT  date = MAX(r.Date)
          FROM    Readings r
          WHERE   r.Date BETWEEN @StartDate AND @EndDate
        ) r2 On r2.date = r1.date          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...