SQL LAG() 함수를 이해
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Key Takeaways
- SQL
LAG()
함수는 동일한 결과 집합 내에서 이전 행의 데이터를 검색합니다. - 복잡한 조인이 필요 없이 추세 분석 및 비교를 간소화합니다.
- 정확한 결과를 얻으려면
ORDER BY
및PARTITION BY
를 적절히 사용해야 합니다.
SQL LAG()
함수는 복잡한 자체 조인 없이도 동일한 결과 집합에서 이전 행의 데이터에 액세스할 수 있도록 하는 강력한 윈도우 함수입니다. 특히 행 간의 값을 비교하여 시간 경과에 따른 차이를 계산하거나 추세를 식별하는 데 유용합니다.
구문
LAG (scalar_expression [, offset [, default_value]]) OVER ( [PARTITION BY partition_expression] ORDER BY order_expression)
- scalar_expression: 값을 검색할 열 또는 식입니다.
- offset: 선택 사항입니다. 현재 행에서 이전 행의 수입니다. 기본값은 1입니다.
- default_value: 선택 사항입니다. 오프셋이 파티션 범위를 벗어날 때 반환할 값입니다. 기본값은 NULL입니다.
- PARTITION BY: 선택 사항입니다. 함수가 적용되는 파티션으로 결과 집합을 나눕니다.
- ORDER BY: 각 파티션의 행 순서를 지정합니다. 이는 필수 사항입니다.
기본 예제
date
및 sales
열이 있는 sales_data
테이블을 고려해 보겠습니다. 각 날짜의 판매량을 이전 날짜의 판매량과 비교하려면 다음과 같이 합니다.
SELECT date, sales, LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales FROM sales_data;
이 쿼리는 이전 날짜의 판매량을 보여주는 previous_day_sales
열을 추가합니다. 이전 날짜가 없으면(예: 첫 번째 행) default_value
에 지정된 대로 0을 반환합니다.
PARTITION BY
사용
각 그룹 내에서 LAG()
함수를 수행하려는 경우(예: 각 부서의 이전 달 수익 계산):
SELECT department, month, revenue, LAG(revenue, 1, 0) OVER (PARTITION BY department ORDER BY month) AS previous_month_revenue FROM department_revenue;
여기서 LAG()
함수는 각 department
내에서 작동하여 비교를 위해 이전 달의 수익을 제공합니다.
실제 사용 사례
- 추세 분석: 현재 값과 이전 값을 비교하여 추세를 식별합니다.
- 차이 계산: 연속된 행 간의 변화를 결정합니다.
- 데이터 유효성 검사: 이전 항목과 비교하여 이상 징후 또는 누락된 데이터를 식별합니다.
고려 사항
- 정렬:
ORDER BY
절은 행의 순서를 정의하므로 매우 중요합니다. 없으면 "이전"이라는 개념이 의미가 없습니다. - 기본값: 오프셋이 사용 가능한 데이터를 벗어나는 경우를 처리하려면
default_value
를 지정합니다. 이렇게 하면 결과 집합에 NULL 값이 나타나지 않습니다. - 성능:
LAG()
는 효율적이지만 복잡한 파티션이 있는 대규모 데이터 세트에서 사용하면 성능에 영향을 줄 수 있습니다. 적절한 인덱싱 및 쿼리 최적화를 확인하십시오.
결론
SQL LAG()
함수는 복잡한 조인 없이 행 간의 비교를 가능하게 하는 데이터 분석에 필수적인 도구입니다. 구문과 응용 프로그램을 이해함으로써 SQL 쿼리 내에서 직접 고급 분석을 수행할 수 있습니다.
FAQs
분석을 위해 현재 행 값과 이전 행 값을 비교할 수 있습니다.
예, PARTITION BY
를 사용하여 별도의 분석을 위해 데이터를 분할합니다.
함수는 기본값을 반환하거나 지정하지 않은 경우 NULL을 반환합니다.
백엔드 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 지불하고 요청이나 요금이 없습니다.
압도적인 비용 효율성
- 유휴 요금 없이 사용량에 따라 지불합니다.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 손쉬운 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 제로 운영 오버헤드 — 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ