Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Jointure SQL à une sous-requête corrélée où les tables sont liées par des plages qui se chevauchent

Vous pouvez le faire en utilisant un CTE et row_number() .

Démo 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

Fondamentalement, le CTE a joint l'élément et l'événement et ajouté une nouvelle colonne pour le numéro de ligne et est partitionné sur l'élément.ID. Voici une capture d'écran de ce à quoi cela ressemble. À partir de là, je sélectionne simplement rNum =1 qui devrait être la date d'événement maximale pour chaque item.id.