如何更新Db2表行并删除现有行?

时间:2013-07-16 04:32:00

标签: db2

DB2表ZB_BILL_ERR:

PROCESS_DATE    CURR_PROCESS_DT  ACCOUNT_NUMBER  SEQ_NUM    ERROR_REASON 
07/14/2013  07/14/2013  A123456789    1     Trancode Invalid
07/15/2013  07/15/2013  B987654321    1     Adjustment code invalid
07/16/2013  07/16/2013  A123456789    2     Multi Single ind invalid

预期产出:

PROCESS_DATE    CURR_PROCESS_DT  ACCOUNT_NUMBER  SEQ_NUM    ERROR_REASON 
07/15/2013  07/15/2013   B987654321   1     Adjustment code invalid
07/14/2013  07/16/2013  A123456789    2     Multi Single ind invalid

A123456789最新一行的处理日期将包含表格中帐户的最早处理日期,在本例中为07/14/2013并删除A123456789的最旧行

1 个答案:

答案 0 :(得分:0)

要识别最新记录,请使用

  row_number() over (partition by account_number
                     order by curr_processs_dt descending
                    ) as aging

将按帐户中的降序日期顺序对您的行进行排名。选择老化= 1的行以获取最新的行。

要获取帐户的最早日期:

select account_number, min(process_dt) as first_processed
  from input
  group by account_number

所以让我们把它放在一个(有点复杂的)SQL语句

MERGE into ZB_BILL_ERR m
USING ( 
        with g as
        (
          select account_number
               , min(process_dt) as first_processed
            from ZB_BILL_ERR 
            group by account_number 
        )
        select i.*
             , row_number() over (partition by account_number
                                    order by curr_processs_dt descending
                                   ) as aging
             , first_processed
            from g
            join ZB_BILL_ERR i  on i.account_number = g.account_number
      ) as x
  ON m.account_number = x.accout_number
  WHEN MATCHED and x.aging = 1  THEN
    UPDATE process_dt = x.first_processed
  WHEN MATCHED and x.aging > 1  THEN
    DELETE
;