2017-01-23 2 views
0

Я ищу запрос, который дает мне для каждого идентификатора последнюю запись (на основе даты, которая дана, и отметки времени).SQL Server query; последняя запись для каждого ID

В моем случае идентификатор «knr», поэтому мне нужна последняя запись каждого KNR в event_ap (совпадающая с pers_stm для получения имен). Im только смог получить этот результат для 1 ID, но не для всех из них.

У меня есть эти таблицы (только примеры, обе таблицы имеют более 10000 entrys)

event_ap 

Ereignis a_nr tnr date   time knr maschnr 
PAN  123  2203 2017-01-23 8:00 11 x222 
PAN  132  2203 2017-01-22 8:00 22 x222 
PAB  123  2203 2017-01-23 9:00 11 x222 
PAN  555  2203 2017-01-23 6:00 33 x222 
PAN  555  2201 2017-01-23 11:00 44 x222 
PAB  222  2202 2017-01-23 10:00 44 x222 

pers_stm 

name knr 
Test1 11 
Test2 22 
Test3 33 
Test4 44 

Что я хочу это

Ereignis tnr date  time knr name maschnr 
PAB  2203 2017-01-23 9:00 11 Test1 x222 
PAN  2203 2017-01-23 6:00 33 Test3 x222 
PAN  2201 2017-01-23 11:00 44 Test4 x222 

мой запрос до сих пор это. Но, очевидно, с этим я получил только последнюю запись одного ID, а не все, что соответствует условию WHERE

SELECT TOP 1 A.Ereignis, A.tnr, A.date, A.time, A.knr, A.maschnr, B.name 
FROM event_ap AS A 
JOIN pers_stm AS B on A.knr = B.knr 
WHERE A.knr = '11' AND A.date = CONVERT(DATETIME, '23.01.2017') ORDER BY A.time DESC 

Спасибо за ваши ответы

+0

, потому что запись была сделана на 2017-01-22, им нужны только значения от 23.01.2017, то есть 2017-01-23 –

+0

есть логика, которая гарантирует, что '(knr, date, time) 'уникально, или ваш вывод запроса должен учитывать две« последние »записи с соответствующими значениями? –

+0

Подождите, вам нужна максимальная дата-время или просто максимальное время для заданной даты? –

ответ

1

Вы можете получить последние записи с этим:

select * From (
    select * from 
    (
     select *, row_number() over (partition by knr order by date desc, time desc) as RN 
     from event_ap 
    ) X 
    where RN = 1 
) Y join pers_stm p pn p.knr = Y.knr 
0

Аналитическая функция row_number может использоваться для этого.

SELECT * 
FROM 
    (SELECT *, 
    row_number() over (partition BY knr order by TIME DESC) AS RN 
    FROM event_ap 
    WHERE DATE = '2017-01-23' 
) t 
WHERE rn = 1; 

Это предполагает, что TIME столбец типа time. Если нет, используйте CONVERT(time ,timecolumn)

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