[SQLD] 노랭이 118번
어려워서 실습을 해보았다.
일단
서브쿼리안에 두개의 케이스가 있는데 그중 하나의 케이스부터 찬찬히 살펴보도록 합시다.
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
FROM TABLE;
이거부터가 어려운데
LAG 부터가 막힌다. LAG ( ) 는 해당 행의 윗(이전행)행의 값을 가져온다.
비교보다, LAG에 대한 이해부터가 시급하므로 SELECT 구문을 활용해서 알아보자.
SELECT
ID,
START_VAL,
NVL(END_VAL, 99) END_VAL,
LAG(END_VAL) OVER (PARTITION BY ID ORDER BY START_VAL, NVL(END_VAL, 99)) AS LAG_END_VAL
FROM TBL1113;
이렇게 조회를 해주면
이런 테이블이 나온다.
1행은 14 위의 행이 없으니 null값이고, 2행은 14가 되고 , 3행은15,,, 이렇게 값을 가져오게 된다.
이런거겠죠
이에 대한 자세한 설명은 GPT에게 물어봤습니다.
LAG(END_VAL) OVER (PARTITION BY ID ORDER BY START_VAL, NVL(END_VAL, 99)): 이 부분에서 OVER 절은 LAG(END_VAL) 함수와 함께 사용되어 현재 행 이전의 행에 있는 END_VAL 값을 가져옵니다. OVER 절 내에서 PARTITION BY ID는 데이터를 ID 열의 값으로 파티션화하고, ORDER BY START_VAL, NVL(END_VAL, 99)는 데이터를 START_VAL 및 NVL(END_VAL, 99) 열 값에 따라 정렬합니다.
그렇다고 하네요.
LAG(컬럼명) OVER : 이전 행 가져오게 하기
PARTION BY (ORDER BY (컬럼명)) : ORDER BY 기준으로 파티션화하기
그럼 다시 첫번째 케이스로 돌아가서
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
FROM TBL1113;
이걸 해주면?
이렇게 나옵니다.
참고 :
https://www.youtube.com/watch?v=nRST3yWDiQw