홈 › SQL 고급 › 03 / 10

행 비교 분석 함수

LAG, LEAD, FIRST_VALUE, LAST_VALUE
섹션 6진행 0 / 10

5. 자주 하는 실수 (Tip)

실수 1: LAST_VALUE 를 프레임 없이 쓴다

프레임을 생략한 LAST_VALUE 는 현재 행까지의 마지막 값, 즉 자기 자신을 돌려줍니다(4절 변형 2). 그룹의 마지막 값이 필요하면 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 을 명시합니다.

실수 2: 첫 행의 NULL 을 빠뜨린다

LAG 의 첫 행은 NULL 이라 WHERE prev <> cur 는 첫 행을 걸러 냅니다. 시작 행이 필요하면 prev IS NULL OR prev <> cur 로 씁니다. LAG(x, 1, 0) 의 기본값 0 이 실제 데이터의 0 과 섞이지 않는지도 확인합니다.

실수 3: ORDER BY 가 유일하지 않다

정렬 값이 같은 행이 있으면 "앞 행"이 어느 것인지 DB 가 임의로 정합니다. 주문일이 같은 두 주문이 있다면 ORDER BY ord_date, id 처럼 유일한 컬럼을 덧붙입니다. 실행할 때마다 결과가 바뀌는 리포트의 흔한 원인입니다.

실수 4: MSSQL 2008 이하에서 LAG 를 쓴다

MSSQL 은 2012 부터 LAG·LEAD·FIRST_VALUE·LAST_VALUE 가 됩니다. MySQL 은 8.0 부터입니다. 운영 DB 버전이 낮으면 오류가 나므로 셀프 조인이나 ROW_NUMBER() 로 대체합니다.