-
SQLD 자격검증실전문제 118번 문제<자격증>/[SQLD] 2023. 3. 19. 14:36728x90
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;
728x90동일하게 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번 보기 처럼 뽑아집니다.728x90'<자격증> > [SQLD]' 카테고리의 다른 글
SQLD 자격검증실전문제 120번 문제 (0) 2023.03.19 sql 교재 pdf (0) 2023.03.19 SQLD 자격검증실전문제 92번 문제 (0) 2023.03.19 SQLD 자격검증실전문제 91번 문제 (0) 2023.03.19 SQLD 보수교육 (0) 2023.02.18