Требуется последняя запись для таблицы для каждого идентификатора - PullRequest
0 голосов
/ 01 июня 2018
SELECT results.time_stamp,
results.result, results.note, tests.test
FROM results INNER JOIN tests
ON results.test_id = tests.id

Мне нужно изменить это, чтобы возвращать только строку с самой новой датой для каждого отдельного test_id.Но я не могу использовать MAX (), потому что note и test являются типом данных text

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Почему бы не использовать subquery вместо:

select r.*
from results r
where date = (select top 1 date
              from tests t 
              where t.id = r.test_id
              order by date desc
             );

Если вы хотите вернуть данные из обеих таблиц, вы можете вместо этого использовать функцию JOIN & использовать row_number():

select top 1 with ties r.*, t.test
from results r inner join 
     tests t
     on t.id = r.test_id
order by row_number() over (partition by r.test_id order by r.date desc);
0 голосов
/ 01 июня 2018

Вот перекрестный ответ:

SELECT 
    results.time_stamp,
    results.result, 
    results.note, 
    tests.test
FROM results
CROSS APPLY
(
    select top 1 *
    from tests t 
    where t.id = results.test_id
    order by date desc
) tests
0 голосов
/ 01 июня 2018

вы можете использовать row_number внутри внутреннего запроса, чтобы решить вашу проблему.Однако, если для идентификатора существует более одной строки с одной и той же временной меткой, будет возвращена только одна строка.

select 
    time_stamp,result,note,test
from
(
SELECT 
    results.time_stamp,
    results.result, 
    results.note, 
    tests.test,
    rn=row__number() over( partition by results.test_id order by results.time_stamp desc)
FROM results 
    INNER JOIN tests
        ON results.test_id = tests.id

)
where rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...