运行总计 - 找到运行总计为 X 的日期

Posted

技术标签:

【中文标题】运行总计 - 找到运行总计为 X 的日期【英文标题】:Runing total - found the date the running total is X 【发布时间】:2020-02-07 10:01:41 【问题描述】:

我需要找出哪些玩家 (CID) 的存款总额为 100 或更多,以及他们达到该金额的确切日期。

存款表:

CID        DATE        Deposit_Amount
===        =====       ===============
1234       1/6          20
2345       5/6          30
1234       16/6         1
1234       18/6         50
3456       19/6         18
1234       25/6         150 
2345       31/7         50
2345       1/8          18
3456       1/9          50 
1234       5/9          23
3456       5/10         33

答案应该是:

CID    Date
===    ====
1234   25/6
3456   5/10

我尝试使用以下查询,但我不知道如何找到用户达到 100 岁及以上的确切日期

SELECT [CID]
      ,[Date]
      ,deposit 
      ,SUM([Deposit])OVER(PARTITION BY CID ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Total_deposit
  FROM [ISC_RAS_CD_MAXDB].[dbo].[Deposits]

有什么建议吗? 谢谢!

【问题讨论】:

【参考方案1】:

考虑:

select cid, min(date)
from (
    select t.*, sum(deposit_amount) over(partition by cid order by date) sum_deposit_amount
    from mytable t
) t
where sum_deposit_amount >= 100
group by cid

子查询在date 上对每个ciddeposit_amount 进行窗口总和;然后外部查询按cid聚合,并选择窗口和等于或大于100的最小值。

【讨论】:

【参考方案2】:

您可以在没有聚合的情况下执行此操作——假设值始终为正:

select cid, date
from (select t.*,
             sum(deposit_amount) over(partition by cid order by date) sum_deposit_amount
      from mytable t
     ) t
where sum_deposit_amount >= 100 and
      sum_deposit_amount - deposit_amount < 100;

这应该比外部聚合更有效。此外,您可以从最先传递该值的行中恢复更多列。

【讨论】:

以上是关于运行总计 - 找到运行总计为 X 的日期的主要内容,如果未能解决你的问题,请参考以下文章

计算 SQL 中日期字段的计数和运行总计

Access Query中基于项目和日期的运行总计

如何查找列的日期和指定值的运行总计?

根据created_at日期获取每月的运行总计

按组 SQL 运行总计 (Oracle)

Mysql 将给定日期范围内的每日总计转化为每周总计