241212 TIL - MySQL LAG와 LEAD

J_log·2024년 12월 12일
0

1. LAG와 LEAD 함수란?

  • LAG() : 현재 행에서 이전 행의 값을 가져온다.
  • LEAD() : 현재 행에서 다음 행의 값을 가져온다.

이 두 함수는 MySQL 8.0부터 지원되며, 윈도우 함수로 사용된다.
이 함수들은 OVER 절과 함께 사용되어 데이터를 그룹화하거나 정렬된 순서에 따라 특정 행의 이전 또는 다음 값을 참조한다.

2. 기본 문법

LAG(column_name, offset, default_value) OVER (
    PARTITION BY column_name
    ORDER BY column_name
)

LEAD(column_name, offset, default_value) OVER (
    PARTITION BY column_name
    ORDER BY column_name
)
  • column_name : 참조할 컬럼 이름
  • offset : 몇 번째 이전/다음 행을 가져올건지 지정 (디폴트 = 1)
  • default_value : 참조할 값이 없을 경우 반환할 기본값 (생략 시 NULL 반환)
  • OVER() : 윈도우 정의로, PARTITION BY와 ORDER BY를 설정

3. LAG와 LEAD 함수의 활용

  1. 고객 행동 분석 : 이전/다음 구매 데이터를 비교하여 구매 주기나 패턴 분석
  2. 주식 데이터 분석 : 전일 종가 대비 변동률 계산
  3. 순위 비교 : 게임 순위판에서 이전 순위와 현재 순위를 비교
  4. 시간 흐름 데이터 : 로그 데이터에서 이전/다음 이벤트를 추적
    등등..

데이터를 정렬하거나 그룹화하여 이전 또는 다음 행의 값을 참조하면, 데이터 흐름을 효과적으로 분석할 수 있다.

참고 예제

https://leetcode.com/problems/consecutive-numbers/description/
같은 숫자가 적어도 3번이상 반복되는 num을 찾는 문제인데 LAG 함수를 이용해봤다.

# Write your MySQL query statement below
SELECT DISTINCT num AS ConsecutiveNums
FROM (SELECT num
           , lag(num, 1) Over (ORDER BY Id) As 'lag'
           , lag(num, 2) Over (ORDER BY id) AS 'lag2'
      FROM Logs) result
WHERE result.num = result.lag AND result.lag2 = result.lag;

0개의 댓글