2017-05-28 5 views
0

Ich habe Tabelle wie folgt. Ich versuche Tage zu berechnenBienenstock: Anfangs- und Enddaten basierend auf einem Flag

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 

Im Idealfall würde ich kaufen möchte eine Ausgabetabelle erstellen, wie unten, um das Start- und Enddatum hat. Es wird für die gleiche 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 

Antwort

0

Ich denke, ein neuer Starttermin nach dem Kauf sein, dies zu tun mit kumulativer max() und min() Fensterfunktionen:

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; 

Das Enddatum ist leichter zu erklären. Es ist das Minimum des Datums bei einem Kauf am oder nach dem angegebenen Datensatz.

Das Startdatum ist das Maximum des Datums bei einem Kauf vor das angegebene Datum. Wenn das NULL ist, ist es das erste Datum für den Besucher.

+0

Erhalte diesen Fehler FAILED: SemanticException Ende eines WindowFrame kann nicht UNBOUNDED PRECEDING – user7088181

+0

@ user7088181 sein. . . Die Hive-Dokumentation besagt explizit, dass dies eine gültige Syntax ist (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics). Die spezifische Sprache ist, dass die folgende Syntax erlaubt ist: (ROWS | RANGE) ZWISCHEN (UNBOUNDED | [num]) PRECEDING UND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLGEND) " –

Verwandte Themen