HIVE:查找运行总数,不包括重复项

时间:2017-09-29 18:20:31

标签: hive

嗨,我手边有一个非常特殊的问题,我无法找到解决方法。我有一个表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中寻找解决方案。非常感谢对此问题的任何投入。

感谢。

1 个答案:

答案 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;将具有相同的执行计划。