sql >> Base de Datos >  >> RDS >> Sqlserver

SQL se une a una subconsulta correlacionada donde las tablas están relacionadas por rangos superpuestos

Puede hacerlo utilizando un CTE y row_number() .

Demostración de 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

Básicamente, el CTE se ha unido al elemento y al evento y ha agregado una nueva columna para el número de fila y está dividido en elemento.ID. Aquí hay una captura de pantalla de cómo se ve. Desde aquí, solo selecciono rNum =1, que debería ser la fecha máxima del evento para cada item.id.