SQL 加入 table 修订日期
SQL Join on table with revision dates
我即将开始为我在 SQL 的公司制定解决方案,该解决方案要求我 link 基于 SKU 编号的产品类别映射。问题是类别映射可以更改,并且它们将具有与更改关联的日期。
例如:
- 产品 1 当前映射到类别 A。
- 用户意识到这是
错误映射并将产品 1 映射更改为类别 B
所有交易日期都在 2018 年 1 月 1 日之后。
- 另一个用户决定将产品 1 映射到类别 C,但仅限于 2019 年 2 月 1 日之后的交易。
等等...
最后,我需要将产品的销售额分配给销售发生时它所在的类别。
我想我可以像下面这样进行连接:
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
我即将开始为我在 SQL 的公司制定解决方案,该解决方案要求我 link 基于 SKU 编号的产品类别映射。问题是类别映射可以更改,并且它们将具有与更改关联的日期。
例如:
- 产品 1 当前映射到类别 A。
- 用户意识到这是 错误映射并将产品 1 映射更改为类别 B 所有交易日期都在 2018 年 1 月 1 日之后。
- 另一个用户决定将产品 1 映射到类别 C,但仅限于 2019 年 2 月 1 日之后的交易。 等等...
最后,我需要将产品的销售额分配给销售发生时它所在的类别。
我想我可以像下面这样进行连接:
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