蜂巢窗口功能-值的行更改

时间:2019-01-16 00:41:25

标签: date hive window

我有一个包含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

当标志值从N更改为Y时,flag_date值将相应地更改。 请帮忙。

1 个答案:

答案 0 :(得分:1)

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