一道Hive面試題:累積報表
阿新 • • 發佈:2019-02-18
我們有如下的使用者訪問資料:
userId | visitDate | visitCount |
---|---|---|
u01 | 2017-01-21 | 5 |
u02 | 2017-01-23 | 6 |
u03 | 2017-01-22 | 8 |
u04 | 2017-01-20 | 3 |
u01 | 2017-01-23 | 6 |
u01 | 2017-02-21 | 8 |
u02 | 2017-01-23 | 6 |
u01 | 2017-02-22 | 4 |
要求使用SQL統計出每個使用者的累積訪問次數,如下表所示:
使用者id | 月份 | 小計 | 累積 |
---|---|---|---|
u01 | 2017-01 | 11 | 11 |
u01 | 2017-02 | 12 | 23 |
u02 | 2017-01 | 12 | 12 |
u03 | 2017-01 | 8 | 8 |
u04 | 2017-01 | 3 | 3 |
分析
首先可以統計出每個使用者每月訪問次數的結果,如下表:
使用者id | 月份 | 小計 |
---|---|---|
u01 | 2017-01 | 11 |
u01 | 2017-02 | 12 |
u02 | 2017-01 | 12 |
u03 | 2017-01 | 8 |
u04 | 2017-01 | 3 |
然後以userId相等為條件進行自連線,可以有類似下面的結果:
u01 2017-01 11 u01 2017-01 11 u01 2017-01 11 u01 2017-02 12 u01 2017-02 12 u01 2017-01 11 u01 2017-02 12 u01 2017-02 12
以左邊的userId,vMonth,vCount進行分組,然後求最右邊一列的和就可以了,當然要加一個現在條件,那就是右邊的vMonth要小於等於左邊的vMonth。
SQL命令
第一步,建立月份訪問統計表:
create table t_vlog_month as
select userId,substr(vDate,1,7) as vMonth, sum(vCount) as mCount
from t_vlog
group by userId,substr(vDate,1,7);
第二步,累積相加:
select t1.userId,t1.vMonth,max(t1.mCount),sum(t2.mCount) as aCount from t_vlog_month as t1 inner join t_vlog_month as t2 on (t1.userId=t2.userId) where t2.vMonth <= t1.vMonth group by t1.userId,t1.vMonth;