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
,因此可以将其删除。
这里有两个 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
,因此可以将其删除。