2013-07-16 2 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를 최신 행의 처리 날짜가이 경우, 테이블에서 계정의 가장 오래된 처리 날짜가됩니다 2013년 7월 14일 그리고 것은, 가장 최근의 레코드를 식별하기 위해 a123456789를

+0

에 함께이를 만들어 보자 :

계정에 대한 가장 빠른 날짜를 얻으려면 가능한 경우 (ID 당 하나의 행만 필요함) 프로 시저에서 갱신 또는 삽입하거나 (DB2 버전에서 지원하는 경우)'MERGE' 문을 사용하십시오 (A123456789에서는 유일 함). 어떤 버전의 DB2입니까? 지금까지 해본 내용은 무엇입니까? –

답변

0

의 가장 오래된 행을 삭제 사용

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

귀하의 행을 계정 내림차순으로 순위를 매 깁니다. 가장 최근의 항목을 얻으려면 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 
; 
관련 문제