2016-03-16 3 views
3

У меня есть эти 2 таблицы в SQL Server 2012 parent-child_tablesПолучить значение ребенка на основе метки времени для каждого родителя

Для каждого родителя я хотел бы получить значение на основе самой последней временной отметки.

Это то, что у меня есть до сих пор, делая некоторые поиски, испытания и ошибки.

select m.id, m.Name, mmi.previousValue 
from [ManualMeters] m 
inner join 
(
    select mm.ManualMeterId, max(mm.Value) previousValue 
    from ManualMetersInput mm 
    --where mm.Timestamp = max(mm.Timestamp) 
    group by mm.ManualMeterId 
     having count(*) > 1 
) mmi on (mmi.ManualMeterId = m.Id) 

Так что я бы ожидать здесь, чтобы увидеть:

ID Name  previousValue TimeStamp 
1  Meter_1 5000   2016-03-19 12:00 
2  Meter_2 3500   2016-03-18 12:15 

Теперь это только показывает максимальные значения, но это не то, что мне нужно. Мне нужно значение из самой последней отметки времени.

+0

Этот вопрос хороший вопрос: Вы утверждаете РСУБД * с версии *, вы предоставляете выборочные данные, вы показываете свои собственные усилия и вы заявляете ожидаемый выход. Стоит перемирие. ** НО **: Пожалуйста ** ** не ** публикуйте свои данные как изображение! Сделайте его copy'n'pasteable, лучше всего с помощью специальных инструкций 'CREATE TABLE' и' INSERT INTO'. – Shnugo

ответ

1

Вы, наверное, нужно что-то вроде этого:

SELECT m.id, m.Name, mmi.previousValue, mmi.TimeStamp 
FROM [ManualMeters] m 
LEFT JOIN 
     (
     SELECT ManualMeterId, Value AS previousValue, TimeStamp, ROW_NUMBER() 
       OVER (PARTITION BY ManualMeterId ORDER BY TimeStamp DESC) AS RowNum 
     FROM ManualMetersInput 

     ) mmi ON mmi.ManualMeterId = m.Id And RowNum = 1 
+0

Работает отлично. Никогда бы не нашел это сам. :) – PitAttack76

+0

Это один из способов сделать это, другие ответы, предложенные моими товарищами, тоже хороши. Подбор правильного зависит в основном от количества записей. –

0

То, что вы, вероятно, ищет это LAST_VALUE функция оконная:

select m.id, m.Name, mmi.previousValue 
    from [ManualMeters] m 
    inner join 
    (
     select DISTINCT 
      mm.ManualMeterId, 
      LAST_VALUE(mm.Value) OVER (PARTITION BY mm.ManualMeterId ORDER BY mm.Timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) previousValue, 
      LAST_VALUE(mm.Timestamp) OVER (PARTITION BY mm.ManualMeterId ORDER BY mm.Timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) previousTimestamp 
     from ManualMetersInput mm 

    ) mmi on (mmi.ManualMeterId = m.Id) 

Более объяснение LAST_VALUE и OVER статей.

+0

Дает ошибку: Столбец «ManualMetersInput.Timestamp» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. – PitAttack76

+0

Попробуйте сейчас - я оставил слишком много предыдущего кода –

+0

Работает сейчас, но в результатах отсутствует метка времени. Какой метод самый быстрый, если у вас будет много записей? – PitAttack76

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