Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Join SQL a sottoquery correlata in cui le tabelle sono correlate da intervalli sovrapposti

Puoi farlo utilizzando un CTE e row_number() .

Demo di 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

Fondamentalmente il CTE ha unito l'elemento e l'evento e ha aggiunto una nuova colonna per il numero di riga ed è partizionato su item.ID. Ecco uno screenshot di come appare. Da qui seleziono semplicemente rNum =1 che dovrebbe essere la data massima dell'evento per ogni item.id.