首页 > 解决方案 > 在 Hive QL 中获取当前和上一个级别

问题描述

我有一张包含以下详细信息的表格。我需要获得当前级别和上一个级别。

ID   Level       start_dt                End_dt  
A      1         2018-03-12 18:39:10     2020-01-01 00:00:00   
A      1         2018-01-17 13:21:26     2018-03-12 18:39:10  
A      2         2018-01-14 13:21:17     2018-01-17 13:21:26 

我的结束状态表如下:ID、current_level、previous_level、升级/降级标志

我尝试根据 END_dt desc 进行排名。但它会将我的第二行列为 2,这不是上一个级别。我可以在一个查询中处理这个吗?还是单跳?

标签: hivehiveql

解决方案


您可以使用 LAG 获取前一行的值,参考文档LAG

create table table_1(ID string,Level int,start_dt timestamp,End_dt timestamp);

insert into table_1 values
('A',1,'2018-03-12 18:39:10','2020-01-01 00:00:00'),
('A',1,'2018-01-17 13:21:26','2018-03-12 18:39:10'),
('A',2,'2018-01-14 13:21:17','2018-01-17 13:21:26');

SQL:

select id,curr_level,prev_level,
case when curr_level=prev_level then 'No Ups - Downs'
when curr_level>prev_level then 'Downgrade'
when curr_level<prev_level then 'Up-Downgrade'
when prev_level is null then 'No-Previous Level'
else 'Unkonwn state'
end upgrade_downgrade_description
from(
select table_1.id,
table_1.level as curr_level,
lag(table_1.level,1) over (partition by table_1.id order by table_1.end_dt desc) prev_level
from table_1) s;

输出:

id  curr_level  prev_level  upgrade_downgrade_description
A   1           NULL        No-Previous Level
A   1           1           No Ups - Downs
A   2           1           Downgrade

推荐阅读