1. 程式人生 > >一道Hive面試題:累積報表

一道Hive面試題:累積報表

我們有如下的使用者訪問資料:

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;