hive window 函数 - 值的行更改

hive window function - row change in value

我的数据有一个 id /flag 和 date 字段 我需要以下面的方式填充 flag_date 字段

login_date      id      flag    flag_date
5/1/2018        100     N       NULL
5/2/2018        100     N       NULL
5/3/2018        100     Y       5/3/2018
5/4/2018        100     Y       5/3/2018
5/5/2018        100     Y       5/3/2018
5/6/2018        100     N       NULL
5/7/2018        100     N       NULL
5/8/2018        100     Y       5/8/2018
5/9/2018        100     Y       5/8/2018
5/10/2018       100     Y       5/8/2018

当Flag值从N变为Y时,flag_date值也随之变化。 请帮忙

select login_date
      ,id
      ,flag
      ,case when flag = 'Y' then min(login_date) over(partition by id,grp) end as flag_date
from (select login_date,id,flag
            ,row_number() over(partition by id order by login_date) - 
             row_number() over(partition by id,flag order by login_date) as grp
      from tbl 
     ) t
  • 首先对行进行分组,即连续的“Y”和 'N' 在序列被打破时开始一个新值。这可以通过不同的行号方法来完成。 (运行内部查询以查看组号是如何分配的
  • 分配组后,使用条件聚合计算 flag_date 就很简单了。

解决此问题的另一种方法是在遇到 'N' 值时生成一个新组。外部查询保持不变,只有内部查询发生变化。

select login_date
      ,id
      ,flag
      ,case when flag = 'Y' then min(login_date) over(partition by id,grp) end as flag_date 
from (select login_date,id,flag
            ,sum(case when flag = 'N' then 1 else 0 end) over(partition by id order by login_date) as grp
      from tbl 
     ) t