hive - 如何“过滤” Hive 表中的记录?
问题描述
想象一下带有 id、status 和 modified_date 的表。一个 id 在表中可以有多个记录。当此状态从旧状态更改为当前状态时,我只需要为具有当前状态的每个 id 以及 modified_date 取出该行。
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 日第 1 个人从 F 到 T 的第二次变化。
所以我期待结果:
id status modified_date,
--------------------------------------------
1 T 5-Jan,
2 T 21-Feb,
3 F 1-Mar,
解决方案
使用 lag() 分析函数,您可以处理前一行来计算 status_changed 标志。然后使用 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)
推荐阅读
- java - NullPointerException @FindBy 在 PageObjectModel 中使用 ChromeDriver 和 Chrome 通过 Selenium
- docker - Kubernetes 和 Docker 的关系
- java - 正则表达式在多行字符串中查找 XML 标记
- keyboard-shortcuts - 使用 Cypress 测试键盘快捷键
- c# - System.ComponentModel.Win32Exception Process.Start
- javascript - React redux 不更新全局状态
- python - 混淆 plt 和 plot 以获得在 Tkinter 框架上的画布上显示的图
- android - 是否可以有两个以上的浮动操作按钮?
- php - DB:Raw 不适用于 postgres 中的日期格式
- c# - 从控制器调用托管在同一服务器上的 Web API,auth 的 AD 名称是 IIS 应用程序池名称而不是用户名