2017-05-28 25 views
0

以下のような表があります。私は購入日を計算しようとしていますハイブ:フラグに基づいて開始日と終了日を取得します

Visitorid date Purch_flag 
A   1-May  NULL 
A   2-May  NULL 
A   3-May  1 
B   1-May  NULL 
B   2-May  1 
B   3-May  NULL 
B   4-May  1 
C   1-May  NULL 

理想的には、開始日と終了日を持つ出力テーブルを作成したいと考えています。

select t.*, 
     coalesce(max(case when purch = 1 then date end) over (partition by visitorid order by date asc rows between unbounded preceding and 1 preceding), 
       min(date) over (partition by visitorid) 
       ) as start_date 
     min(case when purch = 1 then date end) over (partition by visitorid order by date desc) as end_date 
from t; 

終了日が説明するのは簡単です:私はあなたがmax()累積とmin()ウィンドウ機能でこれを行うことができると思う同じvisitorid

Visitorid date Purch_flag start_date end_date 
A   1-May  NULL 1-May  3-May 
A   2-May  NULL 1-May  3-May 
A   3-May  1  1-May  3-May 
B   1-May  NULL 1-May  2-May 
B   2-May  1  1-May  2-May 
B   3-May  NULL 3-May  4-May 
B   4-May  1  3-May  4-May 
C   1-May  NULL  NULL  NULL 

答えて

0

の購入後の新しい開始日があるでしょう。指定されたレコードの前後で購入した日付の最小値です。

開始日は、の前に、の指定された日付までの購入日の最大です。それがNULLの場合は、訪問者の最初の日付です。

+0

このエラーが発生しました:SemanticException WindowFrameの終了は、UNBOUNDED PRECEDING – user7088181

+0

@ user7088181にすることはできません。 。 。 Hiveのドキュメントには、これが有効な構文であることが明示的に記載されています(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics)。 (ROWS | RANGE)と([UNBOUNDED | [num])との間には、次のような構文が許されています: "現在の行|(UNBOUNDED | [num])) –

関連する問題