SQL 행 관련 순서함수(오프셋 함수) 완벽 정리 🚀
안녕하세요! 오늘은 SQL 윈도우 함수 중에서도 행의 순서를 기반으로 데이터를 처리하는 오프셋 함수(OFFSET Functions)에 대해 알아보겠습니다.
오프셋 함수는 특정 행을 기준으로 앞뒤에 위치한 행의 값을 쉽게 참조할 수 있도록 도와줍니다. 주로 데이터를 시계열적으로 분석하거나 비교할 때 매우 유용합니다.
🔍 오프셋 함수의 종류와 특징
SQL에서 가장 자주 사용하는 오프셋 함수는 크게 세 가지입니다:
1️⃣ LAG()
LAG() 함수는 현재 행에서 지정한 수만큼 앞에 있는 행의 값을 반환합니다.
사용법
LAG(컬럼명, offset, 기본값) OVER (ORDER BY 컬럼명)
- offset(생략 가능): 몇 번째 앞의 행을 참조할지 지정 (기본값 1)
- 기본값(생략 가능): 참조할 행이 없을 경우 반환할 값 (기본값 NULL)
예시
SELECT emp_name, salary,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_salary
FROM employee;
- 각 직원의 이전 직원의 급여를 보여줍니다. 첫 행의 경우 이전 행이 없으므로 0을 반환합니다.
2️⃣ LEAD()
LEAD() 함수는 현재 행에서 지정한 수만큼 뒤에 있는 행의 값을 반환합니다.
사용법
LEAD(컬럼명, offset, 기본값) OVER (ORDER BY 컬럼명)
- offset(생략 가능): 몇 번째 뒤의 행을 참조할지 지정 (기본값 1)
- 기본값(생략 가능): 참조할 행이 없을 경우 반환할 값 (기본값 NULL)
예시
SELECT emp_name, salary,
LEAD(salary, 1, 0) OVER (ORDER BY hire_date) AS next_salary
FROM employee;
- 각 직원의 다음 직원의 급여를 표시합니다. 마지막 행은 다음 행이 없으므로 0을 반환합니다.
3️⃣ FIRST_VALUE(), LAST_VALUE()
- FIRST_VALUE(): 지정된 윈도우 범위 내의 첫 번째 행 값을 반환합니다.
- LAST_VALUE(): 지정된 윈도우 범위 내의 마지막 행 값을 반환합니다.
사용법
FIRST_VALUE(컬럼명) OVER (ORDER BY 컬럼명 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
예시
SELECT emp_name, salary,
FIRST_VALUE(salary) OVER (ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS first_salary,
LAST_VALUE(salary) OVER (ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last_salary
FROM employee;
- 입사일 기준으로 처음 입사한 직원의 급여와 현재까지 마지막 직원의 급여를 각각 반환합니다.
⚠️ 주의사항
- 오프셋 함수를 사용할 때는 반드시 ORDER BY 절을 명시해야 합니다.
- FIRST_VALUE(), LAST_VALUE() 함수는 프레임절(Frame Clause)을 함께 사용할 때 정확한 결과를 얻을 수 있습니다.
🎯 요약 정리
함수명 | 역할 | 주요사용예시 |
LAG() | 현재 행 이전의 행 값을 참조 | 이전 시점의 데이터와 비교 분석 |
LEAD() | 현재 행 이후의 행 값을 참조 | 다음 시점의 데이터와 비교 분석 |
FIRST_VALUE() | 윈도우 내 첫 번째 행의 값 반환 | 누적 비교나 최초값 기준 비교 시 사용 |
LAST_VALUE() | 윈도우 내 마지막 행의 값 반환 | 누적 비교나 최신값 기준 비교 시 사용 |
'자격증 > SQLD' 카테고리의 다른 글
[SQLD/자격증] PIVOT / UNPIVOT 완전 정복! (0) | 2025.05.25 |
---|---|
[SQLD/자격증] 계층형 질의 완벽 정리 (0) | 2025.05.25 |
[SQLD/자격증] 윈도우 함수의 프레임절(Frame Clause) 완벽 이해하기 (0) | 2025.05.25 |
[SQLD/자격증] NULL 관련 함수 완벽 정리 (0) | 2025.05.25 |
[SQLD/자격증] 본질식별자와 인조식별자란? (0) | 2025.05.25 |