Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL join a subconsulta correlacionada onde as tabelas estão relacionadas por intervalos sobrepostos


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.