SQLD 자격검증실전문제 118번 문제
LAG, LEAD 문제
문제.
문제.
CREATE TABLE TBL
(ID VARCHAR2(10),
START_VAL NUMBER,
END_VAL NUMBER);
INSERT INTO TBL VALUES ('A', 10, 14);
INSERT INTO TBL VALUES ('A', 14, 15);
INSERT INTO TBL VALUES ('A', 15, 18);
INSERT INTO TBL VALUES ('A', 18, 20);
INSERT INTO TBL VALUES ('A', 20, 25);
INSERT INTO TBL VALUES ('A', 25, NULL);
COMMIT;
SELECT ID, START_VAL, END_VAL
FROM (
SELECT ID, START_VAL, NVL(END_VAL, 99) END_VAL,
(CASE WHEN START_VAL = LAG(END_VAL) OVER (PARTITION BY ID ORDER BY START_VAL, NVL(END_VAL, 99)) THEN 1
ELSE 0
END) FLAG1,
(CASE WHEN END_VAL = LEAD(START_VAL) OVER (PARTITION BY ID ORDER BY START_VAL, NVL(END_VAL, 99)) THEN 1
ELSE 0
END) FLAG2
FROM TBL
)
WHERE FLAG1 = 0 OR FLAG2 = 0
ORDER BY START_VAL, END_VAL;
동일하게 ID, START_VAL, END_VAL을 뽑는데 END_VAL에서 NULL값이면 99로 치환해서 뽑습니다.
그럼 저 테이블과 동일한데 END_VAL의 마지막 값만 NULL 대신 99인겁니다.
그러고 나서 FLAG1, FLAG2 칼럼을 뽑습니다.
ID I START_VAL I END_VAL I FLAG1 I FLAG2
FLAG1의 경우, START_VAL 값이 이전 행의 END_VAL과 같은 경우에는 1이 채워지고 다르다면 0이 채워집니다.
첫행의 START_VAL은 10인데 이전 행은 없으니 비교할 수 없습니다. 그러므로 0이 채워집니다.
두번째 행의 START_VAL은 14인데 이전 행의 END_VAL은 14입니다. 동일하니 1이 채워집니다.
세번째 행의 START_VAL은 15이고 이전 행의 END_VAL은 15입니다. 동일하니 1이 채워집니다.
이런식으로 쭉쭉 내려가시면 됩니다.
FLAG2의 경우, END_VAL값이 다음 행의 START_VAL과 같은 경우에는 1이 채워지고 다르다면 0이 채워집니다.
첫행의 END_VAL은 14, 다음 행의 START_VAL은 14입니다. 동일하니 1이 채워집니다.
두번째 행의 END_VAL은 15, 다음 행의 END_VAL은 15입니다. 동일하니 1이 채워집니다.
네번째 행의 END_VAL은 18, 다음 행의 START_VAL은 20입니다. 값이 다르니 0이 채워집니다.
ORDER BY 절에 순서가 START_VAL 오름차순, END_VAL 오름차순인데 NULL 값일 시 99로 채워집니다.
이 인라인 뷰가 끝나고 나서
WHERE 절에서 FLAG1이 0이거나 FLAG2가 0인 것을 뽑으라 했으니
1번 보기 처럼 뽑아집니다.