嗨,我手边有一个非常特殊的问题,我无法找到解决方法。我有一个表UserViews有以下列:
Progdate(String) UserName(String) Dummy data in the table: Progdate UserName 20161119 A 20161119 B 20161119 C 20161119 B 20161120 D 20161120 E 20161120 A 20161121 B 20161121 A 20161121 B 20161121 F 20161121 G
每次用户查看程序时,表中都有一个条目。例如,11月19日,用户A观看了一次该程序,因此只有一个条目。用户B观看了该节目两次,因此该用户在11月19日有两个条目,依此类推。
选择Progdate,通过Progdate从UserViews组中计算(不同的UserName)UniqueUsersByDate;
以上查询将为我提供所有观看该计划的唯一用户的日期计数
Progdate UniqueUsersByDate 20161119 3 20161120 3 20161121 4
以下查询:
Select Progdate, UniqueUsersByDate, Sum(UniqueUsersByDate) over(Order By Progdate) RunningTotalNewUsers from ( Select Progdate, count(distinct UserName) UniqueUsersByDate from UserViews group by Progdate SORT BY Progdate ) UV;
会给我结果:
Progdate UniqueUsersByDate RunningTotalNewUsers 20161119 3 3 20161120 3 6 20161121 4 10
但我想要的是所有第一次观看该节目的用户的总计。意味着如果用户A在20161119上观看了该节目,然后又在20161120观看了该节目,那么该用户的数量不应该在20161120的运行总数中重复。因此,我想从上表中得到的结果是:
Progdate UniqueUsersByDate RunningTotalNewUsers 20161119 3 3 20161120 3 5 20161121 4 7
我只在HIVE HQL中寻找解决方案。非常感谢对此问题的任何投入。
感谢。
答案 0 :(得分:1)
reset_session
sign_in your_user_object
select Progdate
,UniqueUsersByDate
,sum(Users1stOcc) over
(
order by Progdate
) as RunningTotalNewUsers
from (select Progdate
,count (distinct UserName) as UniqueUsersByDate
,count (case when rn = 1 then 1 end) as Users1stOcc
from (select Progdate
,UserName
,row_number() over
(
partition by UserName
order by Progdate
) as rn
from UserViews
) uv
group by Progdate
) uv
;
P.S。
理论上,SUM分析函数的聚合和使用不需要额外的子查询,但是解析器似乎存在问题(错误/特征)。
请注意,附加的子查询不一定表示另外的执行阶段,例如+-------------+--------------------+-----------------------+
| progdate | uniqueusersbydate | runningtotalnewusers |
+-------------+--------------------+-----------------------+
| 2016-11-19 | 3 | 3 |
| 2016-11-20 | 3 | 5 |
| 2016-11-21 | 4 | 7 |
+-------------+--------------------+-----------------------+
和select * from (select * from (select * from (select * from (select * from t)t)t)t)t;
将具有相同的执行计划。