Hive 如何";“过滤器”;配置单元表中的记录?
想象一下带有id、状态和修改日期的表。一个id在表中可以有多条记录。我只需要为每个具有当前状态的id以及修改的_日期(当该状态从旧状态更改为当前状态时)取出该行Hive 如何";“过滤器”;配置单元表中的记录?,hive,hiveql,Hive,Hiveql,想象一下带有id、状态和修改日期的表。一个id在表中可以有多条记录。我只需要为每个具有当前状态的id以及修改的_日期(当该状态从旧状态更改为当前状态时)取出该行 id status modified_date, -------------------------------------------- 1 T 1-Jan, 1 T 2-Jan, 1
id status modified_date,
--------------------------------------------
1 T 1-Jan,
1 T 2-Jan,
1 F 3-Jan,
1 F 4-Jan,
1 T 5-Jan,
1 T 6-Jan,
2 F 18-Feb,
2 F 20-Feb,
2 T 21-Feb,
3 F 1-Mar,
3 F 1-Mar,
3 F 2-Mar,
尽管我已经做了很多,但我无法捕捉到1月5日第二次从F到T的变化
因此,我期待结果:
id status modified_date,
--------------------------------------------
1 T 5-Jan,
2 T 21-Feb,
3 F 1-Mar,
使用lag()分析函数,您可以寻址前一行以计算更改标志的状态。然后使用row_number将上次状态更改的行标记为1,并对其进行筛选。请参见代码中的注释:
with your_data as (--replace with your table
select stack(12,
1,'T','1-Jan',
1,'T','2-Jan',
1,'F','3-Jan',
1,'F','4-Jan',
1,'T','5-Jan',
1,'T','6-Jan',
2,'F','18-Feb',
2,'F','20-Feb',
2,'T','21-Feb',
3,'F','1-Mar',
3,'F','1-Mar',
3,'F','2-Mar') as (id,status,modified_date)
)
select id,status,modified_date
from
(
select id,status,modified_date,status_changed_flag,
row_number() over(partition by id, status_changed_flag order by modified_date desc) rn
from
(
select t.*,
--lag(status) over(partition by id order by modified_date) prev_status,
NVL((lag(status) over(partition by id order by modified_date)!=status), true) status_changed_flag
from your_data t
)s
)s where status_changed_flag and rn=1
order by id --remove ordering if not necessary
;
结果:
OK
id status modified_date
1 T 5-Jan
2 T 21-Feb
3 F 1-Mar
Time taken: 178.643 seconds, Fetched: 3 row(s)
嗨,朋友!使用问题按钮添加其他信息,而不是评论部分。多谢。非常好和快速的解决方案也为表与百万行。