Дата завершения запроса соединения SQL Server > 3 года назад

#sql-server #join

#sql-сервер #Присоединиться

Вопрос:

У меня есть следующие 2 таблицы в базе данных SQL Server.

Таблица активов —

 Id,
AssetName
  

Таблица проверок —

 Id,
AssetId, (<- This is Id in the Assets table)
InspectionName,
DateStarted,
DateDue,
DateCompleted
  

Актив может иметь несколько проверок, перечисленных в таблице проверок. Как я могу создать запрос, в котором самой новой проверке активов больше 3 лет? (Дата выполнена > 3 года назад для последней проверки).

Запрос, который у меня в настоящее время есть:

 SELECT t1.Id, t1.AssetName FROM [Assets] AS t1 INNER JOIN [Inspections] AS t2 ON t1.Id = t2.AssetID WHERE [DateCompleted] < DATEADD(year, -3, GETDATE()) AND t1.Id NOT IN (SELECT t1.Id FROM [Assets] AS t1 INNER JOIN [Inspections] AS t2 ON t1.Id = t2.AssetID WHERE [DateCompleted] BETWEEN DATEADD(YEAR, -3, GETDATE()) AND GETDATE())
  

Спасибо
Пол.

Комментарии:

1. Покажите запрос, который у вас есть сейчас

2. ВЫБЕРИТЕ t1.Id, t1.AssetName ИЗ [Assets] КАК t1 INNER JOIN [Inspections] КАК t2 НА t1.Id = t2.AssetID ГДЕ [DateCompleted] < DATEADD(год, -3, GETDATE()) И t1.Id ОТСУТСТВУЕТ (ВЫБЕРИТЕ t1.Id ИЗ [Активов] КАК t1 ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ [Проверки] КАК t2 НА t1.Id = t2.AssetID, ГДЕ [Дата завершена] МЕЖДУ DATEADD(ГОД, -3, GETDATE()) И GETDATE())

Ответ №1:

 SELECT
    T1.Id,
    T1.AssetName,
    MAX(DateCompleted) AS InspectionDate
FROM Asset T1
LEFT JOIN Inspections T2 ON T1.Id = T2.AssetId
GROUP BY T1.Id, T1.AssetName
HAVING MAX(DateCompleted) < DATEADD(YY, -3, GETDATE()) -- OR MAX(DateExam) IS NULL (if you want to include assets that were not inspectioned at all)
  

Комментарии:

1. почему LEFT JOIN ?

2. LEFT JOIN заключается в включении ресурсов, у которых нет связанных проверок для OR MAX(DateExam) IS NULL работы части

Ответ №2:

это должно дать вам то, что вы хотели. Вы группируете по идентификатору и имени ресурса и находите максимальное значение DateCompleted и сравниваете с требуемой датой

 SELECT  t1.Id, t1.AssetName 
FROM    [Assets] AS t1 
        INNER JOIN [Inspections] AS t2 ON t1.Id = t2.AssetID 
GROUP BY t1.Id, t1.AssetName 
HAVING  MAX (t2.[DateCompleted] )   < DATEADD(YEAR, -3, GETDATE())