哈喽,小伙伴们,欢迎来到小张的频道,今天给大家讲解一道面试中常见的SQL问题------累计求和问题,希望能帮助到小伙伴们。还需要给大家说明的是这是一个系列性文章,如果您想了解更多面试题型,希望大家多多关注小张哦~
需求: 每个用户每个月累计的总金额
原始数据 accumu.txt
username,month,price
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,7
A,2015-03,9
B,2015-03,11
B,2015-03,6
期望结果:
用户id 月份 当月金额 累计金额
+-------------+----------+---------+-------------+--+
| A | 2015-01 | 33 | 33 |
| A | 2015-02 | 10 | 43 |
| A | 2015-03 | 16 | 59 |
| B | 2015-01 | 30 | 30 |
| B | 2015-02 | 15 | 45 |
| B | 2015-03 | 17 | 62 |
+-------------+----------+---------+-------------+--+
1.建表语句
create table test.accumu(
username string,
monthstr string,
price int
)row format delimited fields terminated by ',';
2.加载数据
load data local inpath '/opt/datas/hive/accumu.txt' into table accumu;
3.答案
SELECT
username,
monthstr,
month_price,
SUM(month_price) over (PARTITION BY username ORDER BY monthstr) accumu_month_price
FROM
(SELECT
username,
monthstr,
SUM(price) month_price
FROM
accumu
GROUP BY
username,monthstr
) t1;
4.执行结果:
+-----------+-----------+--------------+---------------------+
| username | monthstr | month_price | accumu_month_price |
+-----------+-----------+--------------+---------------------+
| A | 2015-01 | 33 | 33 |
| A | 2015-02 | 10 | 43 |
| A | 2015-03 | 16 | 59 |
| B | 2015-01 | 30 | 30 |
| B | 2015-02 | 15 | 45 |
| B | 2015-03 | 17 | 62 |
+-----------+-----------+--------------+---------------------+