Você pode fazer isso utilizando um
CTE
e row_number()
. Demonstração do SQL Fiddle
;with cte as
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY i.id ORDER BY e.EventDate DESC) as rNum
FROM Item i
JOIN Event e
ON i.id between e.ItemStart and e.ItemEnd
)
SELECT ID,
Name,
EventType,
EventDate FROM cte
WHERE rNum = 1
Basicamente o CTE juntou item e evento e adicionou uma nova coluna para rownumber e é particionado em item.ID. Aqui está uma captura de tela do que parece. A partir daqui, apenas seleciono rNum =1, que deve ser a data máxima do evento para cada item.id.