Учитывая вашу текущую таблицу Item_UPC, вы можете сгенерировать эффективные даты начала из Даты прекращения, используя аналитическую функцию LAG:
With Effective_UPCs as (
select [Item_Key]
, [Item_Desc]
, [UPC]
, coalesce(lag([UPC_Discontinue_Date])
over (partition by [Item_Key]
order by coalesce( [UPC_Discontinue_Date]
, datefromparts(9999,12,31))
),
lag([UPC_Discontinue_Date])
over (partition by [UPC]
order by coalesce( [UPC_Discontinue_Date]
, datefromparts(9999,12,31))
)) [UPC_Start_Date]
, [UPC_Discontinue_Date]
from Item_UPCs i
)
select * from Effective_UPCs;
Что дает следующее Результаты :
| Item_Key | Item_Desc | UPC | UPC_Start_Date | UPC_Discontinue_Date |
|----------|-----------|------------|----------------|----------------------|
| 123456 | Shovel | 0007878787 | 2018-04-01 | (null) |
| 123456 | Shovel | 0009595959 | (null) | 2018-04-01 |
| 234567 | Rake | 0009595959 | 2018-04-01 | (null) |
Эта функция создает полностью открытый конец интервала, в котором даты начала и окончания могут быть нулевыми, что указывает на то, что она действует в течение всего времени. Чтобы использовать это в своем запросе, просто укажите Effective_UPCs
CTE вместо таблицы Item_UPCs
и добавьте пару дополнительных предикатов, чтобы учесть даты вступления в силу:
SELECT DISTINCT
s.SiteID
,id.Item_Key
,iu.Item_Desc
,iu.Item_Department
,iu.Item_Category
,iu.Item_Subcategory
,iu.UPC
,iu.UPC_Discontinue_Date
,id.Trans_Date
,id.Purch_Cost
,id.Purch_Qty
FROM Inventory_Details id
INNER JOIN Effective_UPCs iu
ON iu.Item_Key = id.Item_Key
and (iu.UPC_Start_Date is null or iu.UPC_Start_Date < id.Trans_Date)
and (iu.UPC_Discontinue_Date is null or id.Trans_Date <= iu.UPC_Discontinue_Date)
INNER JOIN Sites s ON s.Site_Key = id.Site_Key
Обратите внимание, что в приведенном выше запросе используется частично открытый диапазон (UPC_Start_Date
<</strong> trans_date
<= </strong> UPC_Discontinue_Date
вместо <= для обоих неравенств), что предотвращает возникновение транзакций точно в день прекращения при сопоставлении как предыдущей, так и следующей <code>Item_Key записи. Если транзакции, которые происходят точно в день прекращения, должны соответствовать новой записи, а не старой, просто поменяйте местами два неравенства:
and (iu.UPC_Start_Date is null or iu.UPC_Start_Date <= id.Trans_Date)
and (iu.UPC_Discontinue_Date is null or id.Trans_Date < iu.UPC_Discontinue_Date)
вместо
and (iu.UPC_Start_Date is null or iu.UPC_Start_Date < id.Trans_Date)
and (iu.UPC_Discontinue_Date is null or id.Trans_Date <= iu.UPC_Discontinue_Date)