如何 运行 按日期进行多个分组的累计总数
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
对于不同的投资组合和策略,我有数年的每日利润。对于每个日期、投资组合和策略,我希望看到每日利润(未计算,因为这已经可用),以及 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