Hive 配置单元:查找不包括重复项的运行总数

Hive 配置单元:查找不包括重复项的运行总数,hive,cumulative-sum,Hive,Cumulative Sum,嗨,我手头有一个非常奇怪的问题,我找不到解决办法。我有一个表UserViews,其中包含以下列: Progdate(String) UserName(String) 表中的虚拟数据: Progdate UserName 20161119 A 20161119 B 20161119 C 20161119 B 20161120 D 20161120 E 20161120 A 20161121 B 20161121 A 20161121

嗨,我手头有一个非常奇怪的问题,我找不到解决办法。我有一个表UserViews,其中包含以下列:

Progdate(String)
UserName(String)
表中的虚拟数据:

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日有两个条目,以此类推

Select Progdate, count(distinct UserName) UniqueUsersByDate 
from UserViews 
group by Progdate;
以上查询将为我提供观看该节目的所有独特用户的日期统计

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中寻找解决方案。非常感谢您对这个问题的任何意见

谢谢

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
;
附言。 从理论上讲,聚合和SUM分析函数的使用不需要额外的子查询,但解析器似乎存在一个问题bug/特性。
请注意,附加的子查询不一定表示附加的执行阶段,例如select*from select*from select*from select*from select*from select*from TTT;并选择*from t将具有相同的执行计划。

是否以非ISO格式将日期存储为字符串或其他形式?数据库已创建。我没有任何发言权:我只需要处理现有的问题。顺便说一句,这只是实际表格的缩小版本。实际表有大约50多列。我刚刚发布了相关的一次,让它变得简单。您设计的查询给出了预期的答案。这个查询很复杂,我需要一些时间来消化和理解。一些解释会有助于理解。不过,谢谢你的帮助。
+-------------+--------------------+-----------------------+
|  progdate   | uniqueusersbydate  | runningtotalnewusers  |
+-------------+--------------------+-----------------------+
| 2016-11-19  | 3                  | 3                     |
| 2016-11-20  | 3                  | 5                     |
| 2016-11-21  | 4                  | 7                     |
+-------------+--------------------+-----------------------+