1 -- 当年/月/日累计指标数据初始化
2 with data_day as (
3 select 'a' name,'2016-07-01' as day, 1 as value union all
4 select 'a' name,'2017-07-01' as day, 2 as value union all
5 select 'a' name,'2018-05-01' as day, 3 as value union all
6 select 'a' name,'2018-06-01' as day, 4 as value union all
7 select 'a' name,'2018-07-01' as day, 5 as value union all
8 select 'a' name,'2018-07-02' as day, 6 as value union all
9 select 'a' name,'2018-07-03' as day, 7 as value union all
10 select 'a' name,'2018-08-01' as day, 8 as value union all
11 select 'a' name,'2018-08-03' as day, 9 as value union all
12 select 'a' name,'2018-09-01' as day, 10 as value union all
13 select 'a' name,'2018-09-02' as day, 11 as value union all
14 select 'a' name,'2018-09-03' as day, 12 as value
15 )
16 ,cal as (
17 select '2018-07-01' as day union all
18 select '2018-07-02' as day union all
19 select '2018-07-03' as day union all
20 select '2018-08-01' as day union all
21 select '2018-08-02' as day union all
22 select '2018-08-03' as day union all
23 select '2018-09-02' as day union all
24 select '2018-09-03' as day
25 )
26 select
27 t2.name
28 ,t1.day
29 ,sum(case when t1.day = t2.day then value end) as value_d -- 当日数量
30 ,sum(case when trunc(t1.day,'MM') = trunc(t2.day,'MM') then value end) as value_m -- 当月累计
31 ,sum(case when trunc(t1.day,'YY') = trunc(t2.day,'YY') then value end) as value_y -- 当年累计
32 ,sum(value) as value_t -- 全量累计
33 from cal t1
34 join data_day t2
35 on 1 = 1
36 where t2.day <= t1.day
37 group by
38 t2.name
39 ,t1.day
40 order by
41 t2.name
42 ,t1.day
43 ;
+-------+-------------+----------+----------+----------+----------+--+
| name | day | value_d | value_m | value_y | value_t |
+-------+-------------+----------+----------+----------+----------+--+
| a | 2018-07-01 | 5 | 5 | 12 | 15 |
| a | 2018-07-02 | 6 | 11 | 18 | 21 |
| a | 2018-07-03 | 7 | 18 | 25 | 28 |
| a | 2018-08-01 | 8 | 8 | 33 | 36 |
| a | 2018-08-02 | NULL | 8 | 33 | 36 |
| a | 2018-08-03 | 9 | 17 | 42 | 45 |
| a | 2018-09-02 | 11 | 21 | 63 | 66 |
| a | 2018-09-03 | 12 | 33 | 75 | 78 |
+-------+-------------+----------+----------+----------+----------+--+
1 select
2 day
3 ,sum(value) over(partition by trunc(day,'MM') order by day asc) as value_asc1 -- 当月累计
4 ,sum(value) over(partition by trunc(day,'MM') order by day rows between unbounded preceding and current row) as value_asc2 -- 当月累计
5 from (
6 select '2018-08-01' as day ,100 as value union all
7 select '2018-08-03' as day ,100 as value
8 ) t
9 ;
+-------------+-------------+-------------+--+
| day | value_asc1 | value_asc2 |
+-------------+-------------+-------------+--+
| 2018-08-01 | 100 | 100 |
| 2018-08-03 | 200 | 200 |
+-------------+-------------+-------------+--+