给定表A,其中的行是为每个ID枚举的每个日期(它应该是全面的,即ID=1不会像这里所示的那样在2020年4月1日停止,而是一直持续到2022年):
ID | 日期 |
---|---|
1 | 2020年1月1日 |
1 | 2020年1月2日 |
1 | 2020年1月3日 |
1 | 2020年1月4日 |
2 | 2020年1月 |
2 | 2020年1月2日 |
连接表并使用MAX()
。
SELECT A.id, A.date, MAX(B.date) AS most_recent_special_date
FROM A
JOIN B ON A.id = B.id AND A.date > B.date
GROUP BY A.id, A.date
Barmar的答案运行良好且快速,如果您只想要table_b
中的单个值,如果您想要table_b
中的其他值,则将MAX移动到QUALIFY中可以从该行检索所有值:
因此,对于数据的一些CTE:
with table_a(ID,Date) as (
select column1, to_date(column2, 'mm/dd/yyyy') from values
(1, '1/1/2020'),
(1, '1/2/2020'),
(1, '1/3/2020'),
(1, '1/4/2020'),
(2, '1/1/2020'),
(2, '1/2/2020'),
(2, '4/2/2020')
), table_b(ID,Date) as (
select column1, to_date(column2, 'mm/dd/yyyy') from values
(1, '12/3/2019'),
(1, '1/2/2020'),
(1, '2/5/2020'),
(1, '1/10/2020'),
(2, '2/10/2020'),
(2, '4/11/2020')
)
我们在out联接中也有区别,这取决于你想要最近的包括今天(我的方式>=
)还是不包括今天(Barmar的方式>
)。
select
a.ID,
a.Date,
b.date as "Most Recent Special Date"
from table_a as a
left join table_b as b
on a.id = b.id and a.date >= b.date
qualify b.date = max(b.date) over (partition by a.id, a.date);
给出:
ID | 日期 | 最近特殊日期||
---|---|---|---|
1 | 2020-01-01 | 2019-12-03 | |
1 | 20200-01-02 | 22020-01-02 | |
1 | 22020-01-03 | 20200-01-02 | |
1 | 22020-01-04 | 20200-01-02 | |
2 | 2020-04-02 | 2020-02-10 |