配置单元窗口函数-行值更改

eqoofvh9  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(379)

我有数据,其中有一个id/标志和日期字段,我需要填充在下面的方式标志\日期字段

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时,标志日期值相应地改变。请帮忙。

g9icjywg

g9icjywg1#

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”在序列中断时开始一个新值。这可以通过不同行号的方法来实现(运行内部查询以查看如何分配组号)
一旦分配了组,就可以用条件聚合来计算标志\u日期。
解决这个问题的另一种方法是在遇到“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

相关问题