#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