oracle 按两个表之间的ID和日期匹配,或按最后已知匹配ID匹配

xmq68pz9  于 2023-01-12  发布在  Oracle
关注(0)|答案(1)|浏览(189)

尝试进行以下工作:

  • T1:取id per dt,其中name = A等于most recent by load_id
  • 请注意2023年1月5日的2条记录,其中load_id为2,3 =〉take load_id = 3
  • T2:并显示对应的id per dt for each param行,以及最近的load_id
  • 请注意,2023年1月5日仅保留load_id = 13
  • 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
gr8qqesn

gr8qqesn1#

您的查询可以重写为:

SELECT t2.*
FROM   ( SELECT *
         FROM   table2
         ORDER BY RANK() OVER (PARTITION BY dt, param ORDER BY load_id DESC)
         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 DESC)
  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

其中,对于样本数据,全部输出:
| 数据传输|参数|加载ID|识别号|
| - ------|- ------|- ------|- ------|
| 2023年1月4日|无|十一|1个|
| 2023年1月4日|1个|十一|1个|
| 2023年1月5日|无|十三|三个|
| 2023年1月5日|1个|十三|三个|
| 2023年1月6日|无|十四|三个|
| 2023年1月6日|1个|十四|三个|
| 2023年1月7日|1个|十四|三个|
| 2023年1月8日|1个|十五|三个|
| 2023年1月9日|无|十六|三个|
| 2023年1月9日|1个|十六|三个|
| 2023年1月10日|无|十七|三个|
| 2023年1月10日|1个|十七|三个|
fiddle

相关问题