配置单元:根据标志获取开始和结束日期

时间:2017-05-28 01:40:35

标签: sql hive

我有如下表格。我想计算购买天数

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

理想情况下,我想创建一个如下所示的输出表,其中包含开始日期和结束日期。购买相同的访客后,将有一个新的开始日期

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

1 个答案:

答案 0 :(得分:0)

我认为您可以使用累计max()min()窗口函数执行此操作:

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;

结束日期更容易解释。这是在给定记录上或之后购买的日期的最小值。

开始日期是在给定日期之前购买的日期的最大值。如果是NULL,那么它就是访问者的第一个日期。