#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())