2017-09-29 34 views
0

嗨,我有一個非常奇怪的問題,我無法找到解決方案。我有下列的表UserViews:用戶每次觀看節目沒有在表中的條目HIVE:發現運行總數不包括重複項

 
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的UserViews組中選擇Progdate,統計(不同的用戶名)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

任何您將日期以字符串形式存儲的原因,並且以非ISO格式存儲? –

+0

數據庫已創建。我沒有任何發言權:(我只需要處理現有的事情,順便說一句,這只是實際表格的縮小版本,實際表格大約有50多列,我剛剛發佈了相關內容讓它變得簡單 – Huzefa

回答

1
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 
; 

+-------------+--------------------+-----------------------+ 
| progdate | uniqueusersbydate | runningtotalnewusers | 
+-------------+--------------------+-----------------------+ 
| 2016-11-19 | 3     | 3      | 
| 2016-11-20 | 3     | 5      | 
| 2016-11-21 | 4     | 7      | 
+-------------+--------------------+-----------------------+ 

附:
從理論上說,SUM分析函數的聚合和使用不需要額外的子查詢,但是解析器似乎存在一個問題(bug /功能)。
請注意,附加的子查詢並不一定表示額外的執行階段,例如, select * from (select * from (select * from (select * from (select * from t)t)t)t)t;select * from t將具有相同的執行計劃。

+0

由你設計的查詢給出了預期的答案,查詢很複雜,需要一段時間才能消化和理解,有些解釋會幫助你理解,不過,謝謝你的幫助。 – Huzefa