SQL 捆绑包产品操作

SQL bundle product manipulation

提问人:Demacrado 提问时间:11/22/2022 更新时间:11/23/2022 访问量:48

问:

在我的公司,我们销售由不同产品混合而成的捆绑产品。单个产品 (product_sku) 的齿轮(销售成本)会随着时间的推移而变化,因此捆绑包的齿轮将发生变化。

我需要编写一个 SQL 查询,能够从产品齿轮的历史值中获取捆绑包随时间推移的总齿轮数。捆束的齿轮数是产品的齿轮数之和乘以相应时间范围内的数量。

一个捆绑包可以由 2 个或多个产品组成,不同的产品具有不同的数量。 捆绑包示例:(1xA|1xB, 1xA|1xB|2xC, 1xA|2xB|1xC|2xD...)

产品在不遵循任何模式的情况下更改价格,任何组合都是可能的。

这里有一个我可能会遇到的可能捆绑包的示例:

输入表:

数量 product_sku 齿轮 valid_from valid_to
1xA|1xB 1 一个 3 2022-01-01 2023-01-01
1xA|1xB 1 B 4 2021-01-01 2023-01-01
1xA|1xB 1 一个 6 2020-01-01 2022-01-01
1xA|1xB 1 B 5 2014-01-01 2021-01-01
1xA|1xB 1 一个 2 2014-01-01 2020-01-01

这就是我想得到的:

输出表:

齿轮 valid_from valid_to
1xA|1xB 7 2022-01-01 2023-01-01
1xA|1xB 10 2021-01-01 2022-01-01
1xA|1xB 11 2020-01-01 2021-01-01
1xA|1xB 7 2014-01-01 2020-01-01

我真的不知道如何处理这个问题。我被输入表卡住了。我试过使用窗口函数,我试过使用带有日期的条件,但结果总是不成功......

我遇到的主要问题是捆绑包可以拥有的产品数量不确定,这让我怀疑这在 SQL 中是否可以实现。

关于我该怎么做的任何想法?有什么我不知道的功能吗?我认为答案在于使用窗口函数,但我真的不知道怎么做。

SQL Google-BigQuery 数据操作

评论


答:

0赞 Demacrado 11/23/2022 #1

我能够通过 CROSS JOIN 解决 2 个产品的捆绑包,但我仍然找不到包含 3 个或更多产品的捆绑包的通用解决方案......

SELECT 
  o.bundle_sku,
  o.quantity * o.cogs + s.quantity*s.cogs as Cogs,
  GREATEST(o.dbt_valid_from,  s.dbt_valid_from) dbt_valid_from,
  LEAST(o.dbt_valid_to,  s.dbt_valid_to) dbt_valid_to,

FROM test_table o CROSS JOIN test_table s
WHERE o.sku != s.sku 
AND o.dbt_valid_to > s.dbt_valid_from 
AND o.dbt_valid_to <= s.dbt_valid_to
ORDER BY o.dbt_valid_from DESC

评论

0赞 Community 11/25/2022
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。