题目:有表t,数据如下
date_month |
avg_views |
2022-01 |
3621 |
2022-02 |
3786 |
2022-03 |
2685 |
2022-04 |
2433 |
2022-05 |
2241 |
2022-06 |
2756 |
2022-07 |
3589 |
2022-08 |
4215 |
2022-09 |
5894 |
需要计算:截止到当月,前月距离当月月数*签约views数累计之和,结果如下
date_month |
avg_views |
res |
2022-01 |
3621 |
3621*1 |
2022-02 |
3786 |
3786*1+3621*2 |
2022-03 |
2685 |
2685*1+3786*2+3621*3 |
2022-04 |
2433 |
2433*1+2685*2+3786*3+3621*4 |
2022-05 |
2241 |
2241*1+2433*2+2685*3+3786*4+3621*5 |
2022-06 |
2756 |
2756*1+2241*2+2433*3+2685*4+3786*5+3621*6 |
2022-07 |
3589 |
3589*1+2756*2+2241*3+2433*4+2685*5+3786*6+3621*7 |
2022-08 |
4215 |
4215*1+3589*2+2756*3+2241*4+2433*5+2685*6+3786*7+3621*8 |
2022-09 |
5894 |
5894*1+4215*2+3589*3+2756*4+2241*5+2433*6+2685*7+3786*8+3621*9 |
看着有点像乘法口诀表哈,在这里做一下题目需求的解释:
1.截止到2022-01月:只有3621,距离本月为1个月,即3621*1;
2.截止到2022-02月:1月距离本月为2个月,即1月的3621为3621*2,2月距离本月为1,即3786,求和为3621*2+3786;
以此类推计算截止到每个月的前月累计。
我们只看1月的数值在res列均出现了,相当于直接sum的,这里就可以想到使用sum over开窗函数累加数据
select date_month, avg_views, sum(avg_views) over(orderby date_month) res1 from t
得到的结果如下
date_month |
avg_views |
res1 |
2022-01 |
3621 |
3621*1 |
2022-02 |
3786 |
3786*1+3621*1 |
2022-03 |
2685 |
2685*1+3786*1+3621*1 |
2022-04 |
2433 |
2433*1+2685*1+3786*1+3621*1 |
2022-05 |
2241 |
2241*1+2433*1+2685*1+3786*1+3621*1 |
2022-06 |
2756 |
2756*1+2241*1+2433*1+2685*1+3786*1+3621*1 |
2022-07 |
3589 |
3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1 |
2022-08 |
4215 |
4215*1+3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1 |
2022-09 |
5894 |
5894*1+4215*1+3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1 |
但这个结果好像和预期不一样,如果把res1结果在累加一次,应该会达到预期效果
select date_month, avg_views, sum(res1) over(orderby date_month) res from(select date_month, avg_views, sum(avg_views) over(orderby date_month) res1 from t ) tmp
得到的结果如下,达到了预期效果,其实好像和递归也没啥关系,不知题意为何归为递归
date_month |
avg_views |
res |
2022-01 |
3621 |
3621*1 |
2022-02 |
3786 |
3786*1+3621*2 |
2022-03 |
2685 |
2685*1+3786*2+3621*3 |
2022-04 |
2433 |
2433*1+2685*2+3786*3+3621*4 |
2022-05 |
2241 |
2241*1+2433*2+2685*3+3786*4+3621*5 |
2022-06 |
2756 |
2756*1+2241*2+2433*3+2685*4+3786*5+3621*6 |
2022-07 |
3589 |
3589*1+2756*2+2241*3+2433*4+2685*5+3786*6+3621*7 |
2022-08 |
4215 |
4215*1+3589*2+2756*3+2241*4+2433*5+2685*6+3786*7+3621*8 |
2022-09 |
5894 |
5894*1+4215*2+3589*3+2756*4+2241*5+2433*6+2685*7+3786*8+3621*9 |
今日解析SQL到此为止
拜了个拜