Sql 使用窗口函数更新列mith multple值

Sql 使用窗口函数更新列mith multple值,sql,oracle,sql-update,Sql,Oracle,Sql Update,下表包含大约100000行,每个id都需要更新 组织表A id start_dt end_dt cust_start_dt cust_end_dt 1 8/1/2008 9/12/2019 8/7/2008 9/12/2019 1 9/17/2019 9/20/2019 9/17/2019 12/31/9999 1 9/21/2019 12/31/9999 9/17/2019

下表包含大约100000行,每个id都需要更新

组织表A

id    start_dt    end_dt      cust_start_dt    cust_end_dt
 1    8/1/2008    9/12/2019   8/7/2008          9/12/2019
 1    9/17/2019   9/20/2019   9/17/2019         12/31/9999
 1    9/21/2019   12/31/9999  9/17/2019         12/31/9999
表A应该是这样的

id    start_dt    end_dt      cust_start_dt    cust_end_dt
 1    8/1/2008    9/16/2019   9/17/2019         12/31/9999
 1    9/17/2019   9/20/2019   9/17/2019         12/31/9999
 1    9/21/2019   12/31/9999  9/17/2019         12/31/9999
sql


然后如何接受上述查询并更新表A?

使用
merge
语句

Merge into a a
Using
(select id
        start_dt,
        case 
          when lead(start_dt) over (partition by id order by start_dt) - end_dt > 1 
          then lead(start_dt) over (partition by id order by start_dt) - 1
          else end_dt
        end end_dt, 
        first_value(start_dt) over (partition by id order by start_dt) as cust_start_dt,
        first_value(end_dt) over (partition by id order by start_dt desc) as cust_end_dt
   from a) b
On (a.id = b.id
    And a.start_dt = b.start_dt)
When matched then
Update set
  A.end_dt = b.end_dt,
  A.cust_start_dt = b.cust_start_dt,
  A.cust_end_dt = b.cust_end_dt

干杯

使用
merge
语句

Merge into a a
Using
(select id
        start_dt,
        case 
          when lead(start_dt) over (partition by id order by start_dt) - end_dt > 1 
          then lead(start_dt) over (partition by id order by start_dt) - 1
          else end_dt
        end end_dt, 
        first_value(start_dt) over (partition by id order by start_dt) as cust_start_dt,
        first_value(end_dt) over (partition by id order by start_dt desc) as cust_end_dt
   from a) b
On (a.id = b.id
    And a.start_dt = b.start_dt)
When matched then
Update set
  A.end_dt = b.end_dt,
  A.cust_start_dt = b.cust_start_dt,
  A.cust_end_dt = b.cust_end_dt
干杯