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
@Mahmoud : 감사합니다. 서식을 수정하는 중입니다. – KShan
@ GilM 이전에 찍은 이걸로 찌를 수도 있습니다! – KShan
게시물을 업데이트하는 데 약간의 혼란을 겪었습니다. 새롭게 추가 된 테스트 케이스를 포맷하는 것 (또는 포맷하는 법을 알지 못하는 것)이 있습니다. ( – KShan