很抱歉,如果这是一个重复的问题,但我还没有找到一些东西,直接回答我的问题。我有张桌子看起来像:
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我想添加第四列,该列对每一行都包含该人员在职日期之前的最近日期:
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上并应用一些合理的筛选器和聚合应该可以工作,但我的实际数据大约有数千万行,而且在实践中,考虑到资源限制,这是不可行的。
任何帮助都将不胜感激!
发布于 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 )和范围筛选日期,我们可以检索该人员的最多办公日期(例如
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 https://stackoverflow.com/questions/69743433
复制相似问题