如何 运行 按日期进行多个分组的累计总数

How to run cumulative totals by date with multiple groupings

对于不同的投资组合和策略,我有数年的每日利润。对于每个日期、投资组合和策略,我希望看到每日利润(未计算,因为这已经可用),以及 MTD、QTD、YTD 和 LTD 值。我已经用一些嵌套的 while 循环完成了这个,但是需要永远,而且我相当有信心这可以通过一些连接来完成。如果有人可以引导我完成它,将不胜感激。下面是该练习的简化版本。前 4 列已经可用,我希望完成的是正确的:

Date GROUP_1 GROUP_2 Daily Profits MTD QTD YTD LTD
2021-01-15 A X 1 1 1 1 1
2021-01-19 A X 5 6 6 6 6
2021-01-20 A X 2 8 8 8 8
2021-01-24 A X 5 13 13 13 13
2021-02-19 A X 5 5 18 18 18
2021-02-23 A Y 4 4 4 4 4
2021-03-21 A X 1 1 19 19 19
2021-03-25 A Y 5 5 9 9 9
2021-04-20 A X 5 5 5 24 24
2021-04-24 A Y 2 2 2 11 11
2021-05-20 A X 3 3 8 27 27
2021-05-24 A Y 4 4 6 15 15
2021-01-15 B Y 5 5 5 5 5
2021-01-19 B Y 3 8 8 8 8
2021-01-20 B Y 1 9 9 9 9
2021-01-24 B Y 2 11 11 11 11
2021-02-19 B Y 4 4 15 15 15
2021-02-23 B Y 5 9 20 20 20
2021-03-21 B Y 1 1 21 21 21
2021-03-25 B Y 1 2 22 22 22
2021-04-20 B Y 4 4 4 26 26
2021-04-24 B Y 5 9 9 31 31
2021-05-20 B Y 1 1 10 32 32
2021-05-24 B Y 2 3 12 34 34

类似下面的 SQL 脚本应该可以解决问题:

select 
  value_date,
  group_1,
  group_2,
  daily_profits,
  sum(daily_profits) over (partition by datepart(yy, value_date), datepart(mm, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as MTD,
  sum(daily_profits) over (partition by datepart(yy, value_date), datepart(qq, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as QTD,
  sum(daily_profits) over (partition by datepart(yy, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as YTD,
  sum(daily_profits) over (partition by group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as LTD
from agg_profit
order by value_date, group_1, group_2

SQL Fiddle 供参考:http://sqlfiddle.com/#!18/d6c5f/1

文档可在此处找到:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017