sql - SQL Join 与修订日期的表
问题描述
我即将开始使用 SQL 为我的公司开发一个解决方案,该解决方案要求我根据 SKU 编号链接产品类别映射。问题是类别映射可以更改,并且它们将具有与更改相关联的日期。
例如:
- 产品 1 当前映射到类别 A。
- 用户意识到它被错误地映射,并将 2018 年 1 月 1 日之后的所有交易的产品 1 映射更改为 B 类。
- 另一位用户决定将产品 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
这假设我正在获取每个月的销售额和类别映射,并且每个月的交易都发布到月底日期(“2018 年 1 月 31 日”、“2019 年 4 月 30 日”等)。不幸的是,如果只有一个映射更改,则此 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
ACROSS 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
推荐阅读
- webhooks - 如何从按下按钮启动 webhook 或 java 的人那里获取当前用户 ID?
- python - 不使用 OpenCV 的侵蚀操作
- python-3.x - 按每个子矩阵中的最小正整数升序排列子矩阵
- mysql - 获取与列的 int 值一样多的行
- ibm-content-navigator - 单击搜索模板中的搜索按钮,使用 Content Navigator 插件添加搜索条件
- django - django 中的 form.cleaned_data 为空
- python - 在 TF 2.6 中处理大型数据集时,WGAN 输出“NaN”作为损失
- javascript - 如何在 LWC 中的闪电卡上重叠选择列表字段下拉列表?
- ansible - 在 localhost 上运行脚本的 Ansible 任务
- python-3.x - problem django安装和cmd?