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
我的数据有一个 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