2013-07-16 4 views
0

DB2 Таблица ZB_BILL_ERR:Как обновить строку таблицы Db2 и удалить существующую строку?

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

+0

... Я бы начать делать таблицу уникально на 'A123456789', если это возможно (вам нужна только одна строка для каждого идентификатора), затем либо обновлять или вставлять в процедуру, либо использовать инструкцию' MERGE' (если ваша версия DB2 поддерживает ее). Какая версия DB2, и что вы пробовали до сих пор? –

ответ

0

Чтобы определить самую последнюю запись, используйте

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

, который будет оценивать ваши ряды в порядке убывания даты в учетной записи. Выберите строки, где age = 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 
; 
Смежные вопросы