【发布时间】:2020-12-27 08:02:48
【问题描述】:
假设我是一个包含日期、帐户、产品、购买类型和金额的表格,如下所示:
查看此表,您可以看到对于任何特定的帐户/产品组合,都有买入和卖出。从本质上讲,我想写的是一个 SQL 查询,它标记以下内容:是否有账户以一定数量购买,然后在购买后 30 天内卖出相同或更多的总金额?
例如,我们可以看到帐户 1 在 8 月 1 日以 20k 的价格购买了产品 A。如果我们查看账户 1 在接下来 30 天内对产品 A 的销售总和,我们会看到他们总共售出了 20k - 与最初的购买相同:
理想情况下,查询将返回标记所有这些实例的结果:对于每个单独的购买,查找该产品/帐户在购买后 30 天的所有销售,并且只返回销售总和为的行大于或等于初始购买次数。
编辑:使用提供的示例数据,所需的外观应该或多或少如下所示:
您会看到产品 B/帐户 2 的 8 月 2 日购买未返回,因为该产品/帐户/购买组合在接下来 30 天内的销售总和不等于或超过购买金额35k,但它确实返回了产品 B/账户 2 的 8/3 买入行,因为卖出确实超过了 10k 的买入金额。
我知道我需要将销售与购买结合起来,其中帐户/产品相等且 datediff 小于或等于 30,并且我基本上已将那部分结构化。我似乎无法工作的是运行总额部分,并且仅在该总额大于或等于该购买时才返回数据。我知道我可能需要对运行总和使用 over/partition by 子句,但我正在努力产生正确的结果/正确优化。对此的任何帮助将不胜感激 - 只是寻找一些关于如何解决这个问题的一般方向。
奖励:一旦运行总数超过买入,停止返回卖出的效果会更加强大,例如,我提供的所需输出中的最后两行在技术上是不需要的 - 因为前两行买入后的卖出量已经超过了买入量。
【问题讨论】:
-
1.请不要将数据(或代码)作为图像发布,而应使用格式化文本。 2. 向我们展示你的尝试...
-
如果30天内又有“买”怎么办?
-
@GMB 查询旨在查看每个单独的购买,因此如果同一帐户/产品有多个购买,我们将只查看每个购买 30 天后的销售(即,如果购买发生在 9 月 1 日,我们会查看该帐户/产品在 9 月 2 日之前的相应销售量,看看总和是否超过 9 月 1 日的购买量。如果同一帐户/产品在 9 月 2 日购买,我们会做同样的事情,直到 10 月 2 日或从该日期起的任何 30 天。
-
@DaleK - 礼仪方面的道歉,我不经常使用这个
-
不要道歉 - 只是更新/改进您的问题 :)
标签: sql sql-server datetime sum window-functions