Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Join mit korrelierter Unterabfrage, bei der Tabellen durch überlappende Bereiche verknüpft sind

Sie können dies mit einem CTE tun und row_number() .

SQL-Fiddle-Demo

;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

Grundsätzlich hat der CTE Artikel und Ereignis zusammengefügt und eine neue Spalte für die Zeilennummer hinzugefügt und ist nach Artikel.ID partitioniert. Hier ist ein Screenshot, wie es aussieht. Von hier aus wähle ich einfach rNum =1 aus, was das maximale Ereignisdatum für jede item.id sein sollte.