【问题标题】:SQL SUM stop if hit a threshold如果达到阈值,SQL SUM 停止
【发布时间】:2020-07-11 04:00:58
【问题描述】:

我正在进行回测,如果我对 sale_amount 应用 1000 美元的阈值块,我需要计算每家商店的损失。

比如store_id = a,前两行加起来是700,但是第三笔交易=$400还是会通过,总共700+400=1100,然后一个批处理运行,触发1000块,所以第 4 个 trans 被阻止,我需要计算的是触发块后的所有金额,即 store_id = a ,即 99 美元。 b店是$800+100+50

这是我的示例数据,请告知如何使用临时表来解决这个问题

Create table stadium 
(
     Trans_id int, 
     Store_id varchar, 
     sale_amount int
)

insert into stadium (Trans_id, Store_id, sale_amount) values ('1', 'a', '500')
insert into stadium (Trans_id, Store_id, sale_amount) values ('2', 'a', '200')
insert into stadium (Trans_id, Store_id, sale_amount) values ('3', 'a', '400')
insert into stadium (Trans_id, Store_id, sale_amount) values ('4', 'a', '99')
insert into stadium (Trans_id, Store_id, sale_amount) values ('5', 'b', '700')
insert into stadium (Trans_id, Store_id, sale_amount) values ('6', 'b', '100')
insert into stadium (Trans_id, Store_id, sale_amount) values ('7', 'b', '800')
insert into stadium (Trans_id, Store_id, sale_amount) values ('8', 'b', '100')
insert into stadium (Trans_id, Store_id, sale_amount) values ('9', 'b', '50')

【问题讨论】:

  • 请更新您的问题,尽最大努力自己解决此问题。

标签: sql sql-server


【解决方案1】:

我认为这需要递归 CTE - 因为你达到了一个阈值,但跳过并继续前进。

所以,这就是你所描述的:

with s as (
      select s.*, row_number() over (partition by store_id order by trans_id) as seqnum
      from stadium s
     ),
     cte as (
      select store_id, trans_id, sale_amount as running_amount, 1 as include_flag, seqnum
      from s
      where seqnum = 1
      union all
      select s.store_id, s.trans_id,
             (case when s.sale_amount + cte.running_amount <= 1000 then s.sale_amount + cte.running_amount else cte.running_amount end),
             (case when s.sale_amount + cte.running_amount <= 1000 then 1 else 0 end),
             s.seqnum
      from cte join
           s
           on s.store_id = cte.store_id and s.seqnum = cte.seqnum + 1
     )
select s.*
from cte join
     s
     on s.trans_id = cte.trans_id
where include_flag = 0;

Here 是一个 dbfiddle。

【讨论】:

  • 你能不能把它转换成一种使用临时表的方式,我很难理解
  • 没有 CTE 就不能使用递归。
猜你喜欢
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2017-11-29
  • 2018-10-27
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多