Select 有匹配日期或最新日期记录

Select which has matching date or latest date record

这里有两个 table。

ItemInfo

Id  Description
1   First Item  
2   Second Item
ItemInfoHistory

Id  ItemInfoId  Price   StartDate    EndDate
1   1           45      2020-09-01   2020-09-15
2   2           55      2020-09-26   null
3   1           50      2020-09-16   null

这里是SQL查询。

SELECT i.Id, Price, StartDate, EndDate 
FROM Itemsinfo i 
LEFT JOIN ItemInfoHistory ih ON i.id= ih.ItemsMasterId AND  CONVERT(DATE, GETDATE()) >= StartDate AND ( CONVERT(DATE, GETDATE()) <= EndDate OR EndDate IS NULL)

在 9 月 20 日运行查询时给出以下结果

Id  Price   StartDate   EndDate
1   50      2020-09-16  NULL
2   NULL    NULL        NULL

对于第二项,我想从历史记录中获取最新记录table,如下所示。

Id  Price   StartDate   EndDate
1   50      2020-09-16  NULL
2   55      2020-09-26  NULL

提前致谢。

可能最有效的方法是两次联接。假设“最新”记录的 NULL 值为 EndDate,则:

SELECT i.Id,
       COALESCE(ih.Price, ih_last.Price) as Price,
       COALESCE(ih.StartDate, ih_last.StartDate) as StartDate,
       COALESCE(ih.EndDate, ih_last.EndDate) as EndDate
FROM Itemsinfo i LEFT JOIN
     ItemInfoHistory ih
     ON i.id = ih.ItemsMasterId AND 
        CONVERT(DATE, GETDATE()) >= StartDate AND
        (CONVERT(DATE, GETDATE()) <= EndDate OR EndDate IS NULL) LEFT JOIN
     ItemInfoHistory ih_last
     ON i.id = ih_last.ItemsMasterId AND 
        ih_last.EndDate IS NULL;

实际上,中间联接不需要检查 NULL,因此可以将其删除。