假设我有
Table1
和 Table2
以及以下数据。我想找到每个 JoiningDt
的 Table1
列 Table2
中可用的 ClosestDt
(ID
列)的下一个最接近的日期匹配。注意: Table2
的最接近匹配应大于 Table1
的日期,并且任何两个 ID
不能具有相同的最接近匹配,例如ID
2 应采用 2024 年 4 月 8 日的值,即使 2024 年 4 月 7 日是最近的值,因为它已被 ID
1 占用。
表1:
身份证 | 加入Dt | 文档编号 |
---|---|---|
1 | 2024 年 4 月 5 日 | A123 |
2 | 2024 年 4 月 6 日 | A123 |
3 | 2024 年 4 月 4 日 | B123 |
表2:
文档编号 | 最近Dt |
---|---|
A123 | 2024 年 4 月 3 日 |
A123 | 2024 年 4 月 4 日 |
A123 | 2024 年 4 月 7 日 |
A123 | 2024 年 4 月 8 日 |
B123 | 2024 年 4 月 2 日 |
B123 | 2024 年 4 月 5 日 |
我的预期输出是:
身份证 | 加入Dt | 文档编号 | 最近Dt |
---|---|---|---|
1 | 2024 年 4 月 5 日 | A123 | 2024 年 4 月 7 日 |
2 | 2024 年 4 月 6 日 | A123 | 2024 年 4 月 8 日 |
3 | 2024 年 4 月 4 日 | B123 | 2024 年 4 月 5 日 |
当我尝试左外连接时,我得到:
身份证 | 加入Dt | 文档编号 | 最近Dt |
---|---|---|---|
1 | 2024-04-05 | A123 | 2024-04-07 |
1 | 2024-04-05 | A123 | 2024-04-08 |
2 | 2024-04-06 | A123 | 2024-04-07 |
2 | 2024-04-06 | A123 | 2024-04-08 |
3 | 2024-04-04 | B123 | 2024-04-05 |
select t1.ID
,t1.JoiningDt
,t1.DocNum
,(t2.ClosestDt)
from #Table1 t1
left join #Table2 t2
on t1.DocNum = t2.DocNum and t2.ClosestDt > t1.JoiningDt
我也尝试使用 rownum,但具有挑战性的部分是获取下一场比赛,即 8-apr 而不是 7-apr,对于
ID
2,因为 4 月 7 日已经被 ID
1 占用。请协助。
此查询确保每个“加入日期”都有唯一的下一个“最近日期”匹配。
查询:
WITH
table_a AS (
SELECT
*
FROM
`optimal-weft-418017.78206957.78206957_01` ),
table_b AS (
SELECT
*
FROM
`optimal-weft-418017.78206957.78206957_02`
ORDER BY
docnum,
ClosestDt ),
merged AS (
SELECT
id,
JoiningDt,
a.DocNum,
ClosestDt
FROM
table_a a
LEFT JOIN
table_b b
ON
JoiningDt<ClosestDt
AND a.docnum=b.docnum ),
filtered AS (
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY id, docnum ORDER BY JoiningDt) ROW
FROM
merged
ORDER BY
id,
docnum,
JoiningDt ),
unique_docnum AS (
SELECT
DISTINCT id,
joiningdt,
docnum
FROM
filtered ),
filtered_rows AS (
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY docnum ORDER BY joiningdt) AS ROW
FROM
unique_docnum ),
final AS (
SELECT
DISTINCT a.id,
a.joiningdt,
a.docnum,
a.closestdt
FROM
filtered a
INNER JOIN
filtered_rows b
ON
a.row=b.row
AND a.docnum=b.docnum
AND a.id=b.id)
SELECT
*
FROM
final
ORDER BY
id