如何解决返回另一行30天的总运行量大于或等于该行的量的数据
比方说,我的表格包含日期,帐户,产品,购买类型和金额,如下所示:
通过查看此表,您可以看到,对于任何特定帐户/产品组合,都有买卖。本质上,我想编写的是一个SQL查询,该查询会标记以下内容:是否存在以一定金额购买的帐户,然后从该次购买开始的30天内卖出了相同的总金额?
例如,我们可以看到帐户1在8/1上以2万的价格购买了产品A。如果我们查看接下来30天内产品A的帐户1的连续销售总额,我们看到它们总共售出了2万张-与初始购买相同:
理想情况下,查询将返回标记所有这些实例的结果:对于每个单独的购买,在该购买之后的30天之内查找该产品/帐户的所有销售,并且仅返回行进总销售量为大于或等于该初始购买金额。
编辑:使用提供的示例数据,所需的对象或多或少看起来如下:
您会看到未返回产品B /帐户2在8/2上的购买,因为该产品/帐户/购买组合在接下来的30天内的销售总金额不等于或超过购买金额等于35k,但是它确实返回了产品B /帐户2的8/3上的买入行,因为卖出的确超过了10k的买入量。
我知道我需要将买进与买进自成一体,其中帐户/产品等于并且datediff小于或等于30,而我基本上将这一部分结构化。我似乎无法使用的是运行总计部分,并且仅在该总计部分大于或等于该购买金额时才返回数据。我知道我可能需要使用over / partition by子句作为运行总和,但我一直在努力产生正确的结果/正确地进行优化。在这方面的任何帮助将不胜感激-只是寻找有关如何实现此目标的一般指导。
奖金:一旦运行总额通过买入,停止返还卖出交易的功能将更加强大,例如,从技术上讲,我提供的所需输出中的最后两行就不需要了-因为前两行买入后的卖出量已经超过了买入量。
解决方法
在SQL Server中,一个选项使用横向联接:
select
t.*,case when t.amount = x.amount then 1 else 0 end as is_returned
from mytable t
cross apply (
select sum(amount) amount
from mytable t1
where
t1.purchase_type = 'Sell'
and t1.account = t.account
and t1.product = t.product
and t1.date >= t.date
and t1.date <= dateadd(day,30,t.date)
) x
where t.purchase_type = 'Buy'
横向连接求和后30天内相同帐户和产品的“销售”金额,然后可以将其与购买金额进行比较。该查询为您每笔购买提供一行,并带有一个布尔型标志,指示金额是否匹配。
在支持范围指定窗口功能的数据库中,使用窗口总和可以更有效地表达这一点:
select *
from (
select
t.*,case when amount = sum(case when purchase_type = 'Sell' then amount end) over(
partition by account,product
order by date
range between current row and interval '30' day following
) then 1 else 0 end as is_returned
from mytable t
) t
where purchase_type = 'Buy'
编辑:这将生成与问题中的第三张表相似的结果集:
select t.*,x.*
from mytable t
cross apply (
select
t1.date sale_date,t1.amount sell_amount,sum(t1.amount) over(order by t1.date) running_sell_amount,sum(t1.amount) over() total_sell_amount
from mytable t1
where
t1.purchase_type = 'Sell'
and t1.account = t.account
and t1.product = t.product
and t1.date >= t.date
and t1.date <= dateadd(day,t.date)
) x
where t.purchase_type = 'Buy' and t.amount = x.total_sell_amount
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。