【问题标题】:Match by id and date between 2 tables, OR last known match id按 2 个表之间的 ID 和日期匹配,或最后已知的匹配 ID
【发布时间】:2023-01-12 05:29:38
【问题描述】:

尝试进行以下工作:

  • T1:取id per dt,其中name = Amost recent by load_id
    • 在 23 年 1 月 5 日通知 2 条记录,其中 load_id 为 2 和 3 => 采用 load_id = 3
  • T2:并显示对应的id per dt for each param行,最近的load_id
    • 仅注意 load_id = 13 保留在 05-Jan-23
  • T2:如果日期现在在T1 可用,请保留T2 行匹配最后已知的id

小提琴:https://dbfiddle.uk/-JO16GSj

我的 SQL 似乎有点乱。可以简化吗?

SELECT t2.dt, t2.param, t2.load_id, t2.id FROM
(SELECT 
  dt, 
  param,
  load_id,
  MAX(load_id) OVER (PARTITION BY dt, param) AS max_load_id,
  id
FROM table2) t2

LEFT JOIN
(SELECT * FROM
(SELECT
  dt, 
  id,
  load_id,
  MAX(load_id) OVER (PARTITION BY dt) AS max_load_id
FROM table1
WHERE name = 'A') t1_prep
WHERE t1_prep.load_id = t1_prep.max_load_id) t1

ON t1.dt = t2.dt and t1.id = t2.id
  
WHERE t2.load_id = t2.max_load_id

ORDER BY 1, 2

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的查询可以重写为:

    SELECT t2.*
    FROM   ( SELECT *
             FROM   table2
             ORDER BY RANK() OVER (PARTITION BY dt, param ORDER BY load_id)
             FETCH FIRST ROW WITH TIES
           ) t2
           LEFT OUTER JOIN
           ( SELECT *
             FROM   table1
             WHERE  name = 'A'
             ORDER BY RANK() OVER (PARTITION BY dt ORDER BY load_id DESC)
             FETCH FIRST ROW WITH TIES
           ) t1
           ON t1.dt = t2.dt and t1.id = t2.id
    ORDER BY t2.dt, t2.param
    

    但是,由于来自 t1 的列永远不会输出并与 LEFT OUTER JOIN 连接(并且每个 dt 只会输出单行),因此是否找到与 t1 和该表的匹配无关紧要可以从查询中删除,将其简化为:

    SELECT *
    FROM   (
      SELECT *
      FROM   table2
      ORDER BY RANK() OVER (PARTITION BY dt, param ORDER BY load_id)
      FETCH FIRST ROW WITH TIES
    )
    ORDER BY dt, param;
    

    或使用您的查询:

    SELECT dt, param, load_id, id
    FROM   (
      SELECT dt, param, load_id, id,
             MAX(load_id) OVER (PARTITION BY dt, param) AS max_load_id
      FROM   table2
    )
    WHERE  load_id = max_load_id
    ORDER BY dt, param
    

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 2020-11-03
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多