首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取基于另一列的条件保持的每一行的最新记录(Hive )

获取基于另一列的条件保持的每一行的最新记录(Hive )
EN

Stack Overflow用户
提问于 2021-10-27 17:58:52
回答 1查看 53关注 0票数 0

很抱歉,如果这是一个重复的问题,但我还没有找到一些东西,直接回答我的问题。我有张桌子看起来像:

代码语言:javascript
复制
Person | Date       | In-office 
-------------------------------
1      | 01-01-2021 | 0
1      | 01-02-2021 | 1
1      | 01-04-2021 | 0
1      | 01-08-2021 | 1
2      | 01-02-2021 | 1
2      | 01-05-2021 | 0
2      | 01-09-2021 | 0
3      | 01-01-2021 | 0
3      | 01-02-2021 | 1
3      | 01-06-2021 | 0
3      | 01-09-2021 | 1

我想添加第四列,该列对每一行都包含该人员在职日期之前的最近日期:

代码语言:javascript
复制
Person | Date       | In-office | Most recent in-office 
-------------------------------------------------------
1      | 01-01-2021 | 0         | Null
1      | 01-02-2021 | 1         | Null
1      | 01-04-2021 | 0         | 01-02-2021
1      | 01-08-2021 | 1         | 01-02-2021
2      | 01-02-2021 | 1         | Null
2      | 01-05-2021 | 0         | 01-02-2021
2      | 01-09-2021 | 0         | 01-02-2021
3      | 01-01-2021 | 0         | Null
3      | 01-02-2021 | 1         | Null
3      | 01-06-2021 | 1         | 01-02-2021
3      | 01-09-2021 | 1         | 01-06-2021

在蜂巢里有直接的方法吗?我还没有找到一种使用窗口函数/分区的方法。原则上,将表连接到person上并应用一些合理的筛选器和聚合应该可以工作,但我的实际数据大约有数千万行,而且在实践中,考虑到资源限制,这是不可行的。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2021-10-27 18:32:24

您可以尝试使用MAX窗口函数,并将边界限制为(RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING )前面的行。通过根据人员在case表达式(CASE WHEN in_office=1 THEN cdate END)中是否在办公室中并使用over子句的顺序(ORDER BY date )和范围筛选日期,我们可以检索该人员的最多办公日期(例如

代码语言:javascript
复制
select
   *,
   MAX(CASE WHEN in_office=1 THEN date END) OVER (
       PARTITION BY person 
       ORDER BY date 
       RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING 
   ) as most_recent_in_office
from sample_data 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69743433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档