2017-09-29 1 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はプログラムを1回見て、1つのエントリーがあるとします。ユーザーBはプログラムを2回見ましたので、11月19日にこのユーザーに対して2つのエントリがあります。

を選択します。Progdate、count(distinct UserName)UserViewsグループからUniqueUsersByDateを選択します。問い合わせの上

は私のプログラムのクエリ以下

 
Progdate UniqueUsersByDate 
20161119 3 
20161120 3 
20161121 4 

を見てきたすべてのユニークユーザーの日付ごとのカウント数を与える:

 
Progdate UniqueUsersByDate RunningTotalNewUsers 
20161119 3     3 
20161120 3     6 
20161121 4     10 

 
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; 

は、その結果、私を与えます

しかし、私が望むのは、プログラムを初めて見たすべてのユーザーの合計です。ユーザーAが20161119で番組を視聴した後に20161120で視聴した場合、このユーザーのカウントは20161120の合計で繰り返されるべきではありません。したがって、上記の表から欲しい結果は、

 
Progdate UniqueUsersByDate RunningTotalNewUsers 
20161119  3    3 
20161120  3    5 
20161121  4    7 
です

私はHIVE HQLでのみソリューションを探しています。問題へのあらゆるインプットは非常に高く評価されています。

ありがとうございました。

+0

日付を文字列とそれ以上のものとしてISO以外の形式で保存する理由は何ですか? –

+0

データベースはすでに作成されています。私はそれに何の言葉も持っていません:(私はちょうど既存のもので動作する必要があります。実際には、実際のテーブルの縮小版です。 – 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      | 
+-------------+--------------------+-----------------------+ 

P.S.
理論的には、SUM分析関数の集約と使用には追加のサブクエリは必要ありませんが、パーサーに問題(バグ/機能)があるようです。
追加のサブクエリは必ずしも追加の実行ステージを示すとは限りません。 select * from (select * from (select * from (select * from (select * from t)t)t)t)t;select * from tは同じ実行計画を持ちます。

+0

あなたがデザインした質問は、期待どおりの答えを出します。質問は複雑で、消化して理解するまでには時間がかかりますが、何らかの説明が理解に役立つはずです。 – Huzefa

関連する問題