SQL 加入 table 修订日期

SQL Join on table with revision dates

我即将开始为我在 SQL 的公司制定解决方案,该解决方案要求我 link 基于 SKU 编号的产品类别映射。问题是类别映射可以更改,并且它们将具有与更改关联的日期。

例如:

最后,我需要将产品的销售额分配给销售发生时它所在的类别。

我想我可以像下面这样进行连接:

SELECT 
   A.TransactionDate,
   A.Product,  
   B.Category, 
   SUM(A.Sales) AS TotalSales 
FROM Products AS A 
JOIN CategoryMappings AS B ON 
   A.Product=B.Product AND 
   A.TransactionDate>=B.RevisionDate 
GROUP BY A.TransactionDate, A.Product, B.Category

这假设我正在获取每个月的销售额和类别映射,并且每个月的交易都发布到月末日期(“1/31/2018”、“4/30/2019”等)。不幸的是,如果只有一个映射更改,则此 Join 仅适用于最新的事务,但是如果示例中有三个或更多个怎么办?如果我想根据 2018 年的映射查看 2018 年的销售额怎么办,因为它夹在其他两个映射之间?

我以前用过 Stack Overflow,但这是我的第一个问题,所以如果它缺少信息或格式不正确,请原谅我。

感谢您的帮助!

在无法根据示例数据进行验证的情况下不确定。

但我认为 NOT EXISTS 可以限制为最近的修订版。

SELECT 
   P.TransactionDate,
   P.Product,  
   CatMap1.Category, 
   SUM(P.Sales) AS TotalSales 
FROM Products AS P
JOIN CategoryMappings AS CatMap1 
  ON CatMap1.Product = P.Product 
 AND CatMap1.RevisionDate <= P.TransactionDate

WHERE NOT EXISTS
(
    SELECT 1
    FROM CategoryMappings AS CatMap2
    WHERE CatMap2.Product = P.Product
      AND CatMap2.RevisionDate <= P.TransactionDate
      AND CatMap2.RevisionDate > CatMap1.RevisionDate
)

GROUP BY P.TransactionDate, P.Product, CatMap1.Category

A​​ CROSS APPLY 也可能有效

SELECT 
   P.TransactionDate,
   P.Product,  
   CatMap.Category, 
   SUM(P.Sales) AS TotalSales 
FROM Products AS P
CROSS APPLY
(
    SELECT TOP 1 CM.Category
    FROM CategoryMappings AS CM
    WHERE CM.Product = P.Product 
      AND CM.RevisionDate <= P.TransactionDate
    ORDER BY CM.RevisionDate DESC
) CatMap
GROUP BY P.TransactionDate, P.Product, CatMap.Category