SQLD 자격증

[SQLD] 노랭이 118번

잇연 2023. 11. 13. 16:49

어려워서 실습을 해보았다.

일단 

서브쿼리안에 두개의 케이스가 있는데 그중 하나의 케이스부터 찬찬히 살펴보도록 합시다.

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_VALNVL(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