Hive开窗函数last_value、lead、lag、row_number、rank、dense等

1、求截止到当前行不为空最后一个值

select calendar_day, 
if_trade_dt,
mkt_code,
last_value(tmp_trade_dt, true) over(partition by mkt_code order by calendar_day desc) as gt_trade_dt,
last_value(tmp_trade_dt, true) over(partition by mkt_code order by calendar_day) as lt_trade_dt
from(
select calendar_day, mkt_code,if_trade_dt, null as tmp_trade_dt from tmp_03 
union all 
select calendar_day, mkt_code,if_trade_dt, calendar_day as tmp_trade_dt
from tmp_05 ) t1

Hive开窗函数last_value、lead、lag、row_number、rank、dense等_第1张图片

2、求上一个值和下一个值

 

select 
calendar_day,
if_trade_dt,
mkt_code,
lead(calendar_day, 1, date '2999-12-31') over (partition by mkt_code order by calendar_day) as gt_trade_dt,
lag(calendar_day, 1, date '1900-01-01') over (partition by mkt_code order by calendar_day) as lt_trade_dt
from tmp_06 where if_trade_dt = '是'

Hive开窗函数last_value、lead、lag、row_number、rank、dense等_第2张图片

 

3、row_number:按顺序排序,排序的值不会重复,rank:大小一样,排序的值一样,但会占用排名的位置,dense:排序值重复,排名并列,排名依次增加,代码和运行效果如图:

select calendar_dt,
rank() over(order by calendar_dt) rank_rn,
dense_rank() over(order by calendar_dt) dense_rn,
row_number() over(order by calendar_dt) row_rn
from t00_tradedate_extend
where calendar_dt between '20080101' and '20080105'

 

 

你可能感兴趣的:(hive)