Я пытаюсь получить список сотрудников и их национальности:
select concat([Firstname],[Lastname]) as 'Full name',[C].[Label] as 'Nationality' FROM [Employee] [E]
left join [AF_AdminFile] [AFA] on E.AdminFileId=AFA.AdminFileId
left join [AF_Nationality] [AFN] on AFN.AdminFileId= AFA.AdminFileId
left join [Country] [C] on AFN.CountryId=C.ID
В результате получаю следующее:
В этом случае сотрудник изменил свою национальность, поэтому в таблице Employee
есть атрибут UpdatedDate
, который отличается от NULL (после изменения национальности)
Когда я добавляю условие даты в свой запрос как получение max(UpdatedDate)
для получения последней записи для «DavidFELTEN», я получаю тот же результат, что и на картинке выше:
select concat([Firstname],[Lastname]),[C].[Label] as 'Nationality' FROM [Employee] [E]
left join [AF_AdminFile] [AFA] on E.AdminFileId=AFA.AdminFileId
left join [AF_Nationality] [AFN] on AFN.AdminFileId= AFA.AdminFileId
left join [Country] [C] on AFN.CountryId=C.ID
where [E].UpdatedDate = (select max([Emp].UpdatedDate) from [Employee] [Emp]
where [Emp].EmployeeId=[E].EmployeeId)
Пример данных и желаемый результат были бы полезны.
Используйте ROW_NUMBER
:
WITH cte AS (
SELECT CONCAT([Firstname], [Lastname]) AS full_name,
[C].[Label] AS Nationality,
ROW_NUMBER() OVER (PARTITION BY E.EmployeeId ORDER BY UpdateDate DESC) rn
FROM [Employee] [E]
LEFT JOIN [AF_AdminFile] [AFA]
ON E.AdminFileId = AFA.AdminFileId
LEFT JOIN [AF_Nationality] [AFN]
ON AFN.AdminFileId = AFA.AdminFileId
LEFT JOIN [Country] [C]
ON AFN.CountryId = C.ID
)
SELECT
full_name,
Nationality
FROM cte
WHERE rn = 1;
Я запутался, не будет ли новая строка иметь значение
NULL
?