Получите последнее время ввода с помощью SQL, если ваш результат возвращает два разных времени, следует ли мне использовать перекрестное или внешнее применение?

#sql #datediff #cross-apply #outer-apply

Вопрос:

Поэтому я хочу использовать datediff для двух таблиц, которые я объединяю. Проблема в том, что если я фильтрую по уникальному значению, оно возвращает две строки результата. Например:

 select *
from [internalaudit]..ReprocessTracker with (nolock)
where packageID = '1983446'
 

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

 User               RepackageTime

KimVilder          2021-06-10
DanielaS           2021-06-05
 

Я хочу использовать последнюю версию repackagetime этого уникального идентификатора пакета, а затем выполнить datediff с другой записью времени, когда я выполняю объединение с другой таблицей.

Есть ли способ подать файл, чтобы я мог получить последнюю запись времени в Repackagetime?

Ответ №1:

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

Одним из способов является использование apply и выбор max даты для каждого пакета.

 select DateDiff(datepart, t.datecolumn, r.RepackageTime)...
from othertable t
cross apply (
    select Max(RepackageTime)RepackageTime
    from internalaudit.dbo.ReprocessTracker r
    where r.packageId=t.packageId
)r
 

Ответ №2:

 select * 
from Othertable t1
join (
select *
from [internalaudit]..ReprocessTracker t2
where packageID = '1983446'
limit 1
) t2
on t1.id = t2.id 
 

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

также для обобщения приведенного выше запроса:

 select * 
from Othertable t1
cross join (
select *
from [internalaudit]..ReprocessTracker t2
where t1.packageID = t2.packageID
limit 1
) t2