首页 > 解决方案 > Oracle 自连接从每个分区的最小值开始

问题描述

我有这张桌子:

COL1    COL2    COL3
--------------------
   A       1    VAL1
   A       2    VAL2
   A       4    VAL3
   B       2    VAL4
   B       4    VAL5
   B       5    VAL6

我想获得这个输出:

COL1    COL2    COL3
--------------------
   A       1    VAL1
   A       2    VAL2
   A       3    NULL
   B       2    VAL4
   B       3    NULL
   B       4    VAL6

逻辑:

对于 COL1 的每个分区,取最小的 COL2 值,取以下 3 个数字,如果第一个表中存在 COL1 和 COL2 的组合,则显示 COL3,否则显示 NULL。

标签: sqloracle

解决方案


“递归 WITH 子句”的另一种解决方案

With rws_numbered (COL1, COL2, COL3, rn) as (
select COL1, COL2, COL3
  , row_number()over(order by col1, col3) rn
from Your_table
)
, cte ( COL1, COL2, COL3, rn ) as (
  select COL1, COL2, COL3, rn
  from rws_numbered
  where rn = 1
  union all
  select 
      t.COL1
    , case when t.col1 = c.col1 then c.col2 + 1 else t.col2 end COL2
    , t.COL3    
    , t.rn
  from rws_numbered t 
  join cte c 
    on c.rn + 1 = t.rn 
)
select COL1, COL2, case when exists (select null from Your_table t where t.COL1 = cte.COL1 and t.COL2 = cte.COL2) then COL3 else null end COL3
from cte
order by 1, 2
;

db<>小提琴


推荐阅读