2017-11-27 4 views
0

아래 시나리오를 처리하기 위해 쿼리에 도움이 필요합니다.내역 처리 시나리오 문제

아래의 기록이 활성화 :

다음
ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 
18,593,122 12/11/07 8:45 C  12/11/07 8:45 
18,593,122 12/11/07 8:45 A  11/13/11 0:00 
18,593,122 11/13/11 0:00 C  12/26/11 10:36 
18,593,122 12/26/11 10:36 A  ? 

가 닫혀 :

ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 
18,593,122 12/11/07 8:45 C  ? 

내가 레코드가 올바르게 종료되지 않은 테이블에 레코드를 삽입해야합니다. 폐쇄 기록이없는 위의 기록에서

ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 

: 는 예를 들어 기록 아래와 같이있다.

이러한 레코드를 식별하고 테이블에 삽입해야합니다.

다음 샘플은 영향을받습니다. 처리 할 수없는 시나리오 아래

10,866 7/29/96 0:01 A  12/27/03 14:16 
10,866 7/25/00 0:01 A  8/20/00 23:59 
10,866 8/20/00 23:59 C  10/2/02 13:00 
10,866 10/2/02 13:00 A  7/25/04 14:11 
10,866 12/27/03 14:16 C  7/25/04 14:11 
10,866 7/25/04 14:11 C  7/25/04 14:11 
10,866 7/25/04 14:11 A  ? 
10,866 5/28/11 16:24 T  5/28/11 16:24 

: 기록을 accs_meth_status_type_cd = 'A'와 null이 아닌 종료 날짜 (아래의 강조). 가 예상 : 기록 accs_meth_status_type_cd = 'C'와 실제 삽입해야합니다 accs_meth_status_type_cd와 기록을 = 'C'가 내가 이해에서

10,866 7/29/96 0:01 A  12/27/03 14:16 
10,866 7/25/00 0:01 A  8/20/00 23:59 
10,866 8/20/00 23:59 C  10/2/02 13:00 
10,866 10/2/02 13:00 A  7/25/04 14:11 
10,866 12/15/04 14:16 A  ? 
+0

닫힌 상태와 열린 상태가 같습니다. 어떤 차이가 있습니까? 둘 다 최신 레코드에 대해'end_dt = NULL'을 가지고 있습니까? – zarruq

+0

활성 레코드의 종료일이 null이고 상태가 c 인 레코드가없고 닫은 레코드의 경우 종료 날짜가 null이 아닌 레코드와 상태 c 및 종료 날짜가 null 인 레코드가있는 경우 – user3901666

답변

1

를 삽입하기되지 않으며, a는 올바르게 (즉, ID)를 구성 기록을 폐쇄 :

  • 행 1 : 상태 <> 'C'및 End_Dt가 NULL이 아닌
  • 행 2 : 상태 = 'C'및 End_Dt는
  • End_Dt 행 # 1 = START_DT I의 null n 행 # 2

이렇게 가정하면 닫아야 할 레코드를 찾을 수 있습니다 (예 : 행 # 1을 가지고 있지만 행 # 2) 누락 :

INSERT INTO mytbl (ID, Start_Dt, Status, End_Dt) 
SELECT 
    a.ID, 
    a.End_Dt, -- Use the unclosed row's End_Dt as the Start_Dt for the new "to-be-inserted" row 
    'C', 
    NULL 
FROM mytbl a 
WHERE a.status <> 'C' 
AND a.End_Dt IS NOT NULL -- Get rows that should be considered closed 
AND (a.ID, a.End_Dt) NOT IN (
    -- Check for corresponding records that do not also have a 'C' row 
    -- You can also do this as a LEFT JOIN above 
    SELECT ID, Start_Dt 
    FROM mytbl 
    WHERE Status = 'C' -- Check for presence of 'C' rows 
    AND End_Dt IS NULL -- Check 
) 
QUALIFY ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY End_Dt DESC) = 1 -- Only return one row per "unclosed" record 
; 

이 모든 가장자리 경우를 처리하지 않을 것이다, 그러나 당신이 시작할 수 있어야합니다. 그것이 당신이 찾고있는 것이라면 알려주세요. 업데이트

은 당신이 제공하는 5 개의 새 행에 대한 위의 쿼리를 실행하고,이 결과를 내가 가지고 :

id  start_dt     status end_dt 
1 10,866 7/25/2000 00:01:00.000000 A  8/20/2000 23:59:00.000000 
2 10,866 8/20/2000 23:59:00.000000 C  10/2/2002 13:00:00.000000 
3 10,866 7/29/1996 00:01:00.000000 A  12/27/2003 14:16:00.000000 
4 10,866 10/2/2002 13:00:00.000000 A  7/25/2004 14:11:00.000000 
5 10,866 12/27/2003 14:16:00.000000 A  ? 
6 10,866 7/25/2004 14:11:00.000000 C  ? 

행 # 1-5 원래의 행입니다. 행 번호 6은 새로 삽입 된 'C'행이며, 행 4 번에 해당하며 부적절하게 닫힌 'A'행에 해당합니다. 이게 당신이 기대하는 것과 그렇지 않은 것입니까?

+0

감사합니다. Ravioli .. 다시 귀하에게 연락합니다. :) – user3901666

+0

Dear @Ravioli, 현재 코드에서 임시로 종료 된 레코드도 닫히고 C로 다른 레코드가 삽입됩니다. 위의 코드에 샘플을 첨부했습니다. 알려주십시오. – user3901666

+1

해당 'C'행이없는 'A'행만 닫으려는 경우 WHERE 절을 다음과 같이 변경하십시오. WHERE a.status = 'A'' 쿼리에'C ' 'Start_Dt' 값 = 'A'행의 'End_Dt' 값으로 설정하십시오. "_Dt"값이 일치하지 않으면 닫히지 않은 것으로 간주되고 새 'C'행이 삽입됩니다. 또한이 쿼리는 주어진 레코드에 대해 닫히지 않은 'A'행이 여러 개있는 경우를 처리하지 않습니다. 가장 최근의 것만 볼 것입니다. 행 순서의 중간에 'C'행을 올바르게 삽입하려면 더 많은 논리가 필요합니다. – ravioli