SQL - 如何从两个表中找到每条记录最接近的日期匹配,而不匹配 2 行的相同日期

问题描述 投票:0回答:1

假设我有

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 占用。请协助。

sql database date
1个回答
0
投票

此查询确保每个“加入日期”都有唯一的下一个“最近日期”匹配。

查询:

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
© www.soinside.com 2019 - 2024. All rights reserved.