2012-09-25 2 views
3

이 질문은 이전 질문 here의 변형입니다. 예제를 사용하여 문제를 설명하기를 희망합니다.CTE를 사용하여 이전 행 값의 값을 업데이트하십시오.

DECLARE @Test TABLE (GID  int,    Seq  int, 
        IsLive bit,    Eff  date, 
        Name  varchar(50),  Salary decimal) 

INSERT INTO @Test VALUES (1, 1, 1, '01-08-2012', 'RTS', NULL) 
INSERT INTO @Test VALUES (1, 2, 0, '01-09-2012', 'RTA', NULL) 
INSERT INTO @Test VALUES (1, 3, 1, '01-10-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (1, 4, 0, '01-11-2012', NULL, NULL) 
INSERT INTO @Test VALUES (1, 5, 1, '01-12-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (2, 1, 1, '01-08-2012', 'RTS', NULL) 
INSERT INTO @Test VALUES (2, 2, 0, '01-09-2012', 'RTA', NULL) 
INSERT INTO @Test VALUES (2, 3, 1, '01-10-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (2, 4, 0, '01-11-2012', 'GSM', NULL) 
INSERT INTO @Test VALUES (2, 5, 1, '01-12-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (3, 1, 1, '01-01-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (3, 2, 0, '01-02-2012', NULL, NULL) 
INSERT INTO @Test VALUES (4, 1, 1, '01-01-2012', NULL, NULL) 
INSERT INTO @Test VALUES (4, 2, 0, '01-02-2012', 'FSA', NULL) 
INSERT INTO @Test VALUES (4, 3, 0, '01-03-2012', NULL, NULL) 
INSERT INTO @Test VALUES (5, 1, 0, '01-01-2012', NULL, NULL) 
INSERT INTO @Test VALUES (5, 2, 1, '01-02-2012', 'LSI', NULL) 
INSERT INTO @Test VALUES (5, 3, 0, '01-03-2012', NULL, NULL) 
INSERT INTO @Test VALUES (6, 1, 1, '01-01-2012', NULL, NULL) 
INSERT INTO @Test VALUES (6, 2, 0, '01-02-2012', 'LSI', NULL) 
INSERT INTO @Test VALUES (6, 3, 1, '01-03-2012', NULL, NULL) 

SELECT * FROM @Test 

다음, 두 샘플 결과가을 설정입니다 : 그래서 여기

샘플 데이터
샘플 데이터로 작업하는 것입니다. 스 니핏이 삽입 나타나지만 점 허용 출력의 모습 설정 어떤 표시한다 : 행 다음의 값을 IsLive=0을 갖는 경우 다음 데이터 집합

예제 출력 # 1
그 열은 NULL 값을 건너 뛰고 그 아래의 IsLive=1이있는 행의 동일한 열 값을 덮어 써야합니다. 첫 번째 IsLive=0 행 앞에 IsLive=1 행을 무시하십시오. 아래에 설정된 데이터

INSERT INTO @Test VALUES (1, 1, 1, '01-08-2012', 'RTS', NULL) 
    INSERT INTO @Test VALUES (1, 2, 0, '01-09-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (1, 3, 1, '01-10-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (1, 4, 0, '01-11-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (1, 5, 1, '01-12-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 1, 1, '01-08-2012', 'RTS', NULL) 
    INSERT INTO @Test VALUES (2, 2, 0, '01-09-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 3, 1, '01-10-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 4, 0, '01-11-2012', 'GSM', NULL) 
    INSERT INTO @Test VALUES (2, 5, 1, '01-12-2012', 'GSM', NULL) 
    INSERT INTO @Test VALUES (3, 1, 1, '01-01-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (3, 2, 0, '01-02-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (4, 1, 1, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (4, 2, 0, '01-02-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (4, 3, 0, '01-03-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (5, 1, 0, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (5, 2, 1, '01-02-2012', 'LSI', NULL) 
    INSERT INTO @Test VALUES (5, 3, 0, '01-03-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (6, 1, 1, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (6, 2, 0, '01-02-2012', 'LSI', NULL) 
    INSERT INTO @Test VALUES (6, 3, 1, '01-03-2012', 'LSI', NULL) 

    SELECT * FROM @Test AS FakedOutput_1 

예제 출력 # 2
행 다음 위에 행에서 아래 여기서 IsLive=1가 동일한 컬럼의 값을 기록해야 그 열의 값 IsLive=0있다. NULL 값이있는 열은 이전 행의 값을 사용합니다. 여기
솔루션 시도

INSERT INTO @Test VALUES (1, 1, 1, '01-08-2012', 'RTS', NULL) 
    INSERT INTO @Test VALUES (1, 2, 0, '01-09-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (1, 3, 1, '01-10-2012', 'RTA', NULL) 
    -- <- the following row is different from prev 
    INSERT INTO @Test VALUES (1, 4, 0, '01-11-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (1, 5, 1, '01-12-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 1, 1, '01-08-2012', 'RTS', NULL) 
    INSERT INTO @Test VALUES (2, 2, 0, '01-09-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 3, 1, '01-10-2012', 'RTA', NULL) 
    INSERT INTO @Test VALUES (2, 4, 0, '01-11-2012', 'GSM', NULL) 
    INSERT INTO @Test VALUES (2, 5, 1, '01-12-2012', 'GSM', NULL) 
    INSERT INTO @Test VALUES (3, 1, 1, '01-01-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (3, 2, 0, '01-02-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (4, 1, 1, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (4, 2, 0, '01-02-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (4, 3, 0, '01-03-2012', 'FSA', NULL) 
    INSERT INTO @Test VALUES (5, 1, 0, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (5, 2, 1, '01-02-2012', 'LSI', NULL) 
    INSERT INTO @Test VALUES (5, 3, 0, '01-03-2012', 'LSI', NULL) 
    INSERT INTO @Test VALUES (6, 1, 1, '01-01-2012', NULL, NULL) 
    INSERT INTO @Test VALUES (6, 2, 0, '01-02-2012', 'LSI', NULL) 
    INSERT INTO @Test VALUES (6, 3, 1, '01-03-2012', 'LSI', NULL) 

    SELECT * FROM @Test AS FakedOutput_2 

내가 지금까지 가지고 올 것을이지만, 테스트 케이스 APPLY 작품을 사용하여 내 첫 번째 테스트 케이스 (GID=1)

;WITH CTE AS ( 
    -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    SELECT T.GID, T.SEQ, T.IsLive, NULL cGuid, NULL cSEQ, 
      cast(0 as bit) cIsLive, T.Name, T.Salary 
    FROM @Test T 
    JOIN @Test S ON T.GID = S.GID AND T.Seq = S.Seq AND S.IsLive = 0 
    -- - - - - - - 
     UNION ALL 
    -- - - - - - - 
    SELECT t.GID, t.SEQ, T.IsLive, c.GID cGID, c.Seq cSEQ, 
      c.IsLive cIsLive, ISNULL(C.Name, T.Name), 
      ISNULL(t.Salary, c.Salary) 
    FROM CTE c 
    JOIN @Test t ON t.GID  = c.GID AND 
          t.Seq  > c.Seq AND 
          t.IsLive = 1  AND 
          c.IsLive = 0 
    -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
) 
--SELECT * FROM CTE ORDER BY CTE.GID, CTE.Seq 
UPDATE t 
SET  Name = c.Name, Salary = c.Salary 
FROM @Test t 
JOIN CTE c  ON c.GID = t.GID AND c.Seq = t.SEQ 
WHERE C.cIsLive IS NOT NULL 
+0

@Mahmoud : 감사합니다. 서식을 수정하는 중입니다. – KShan

+0

@ GilM 이전에 찍은 이걸로 찌를 수도 있습니다! – KShan

+0

게시물을 업데이트하는 데 약간의 혼란을 겪었습니다. 새롭게 추가 된 테스트 케이스를 포맷하는 것 (또는 포맷하는 법을 알지 못하는 것)이 있습니다. ( – KShan

답변

관련 문제