LAG와 LEAD로 인접한 행 다루기
SELF JOIN 없이 이전 행과 다음 행의 값에 접근합니다.
LAG와 LEAD로 인접한 행 다루기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 묻는 질문
분석가 면접에서 가장 자주 나오는 질문 중 하나는 다음과 같습니다. "자체 조인 없이 각 행을 바로 앞 행과 비교하세요." 전월 대비 매출, 사용자의 이전 로그인, 순서에서 다음 이벤트 등을 생각해 보세요.
깔끔한 답은 LAG와 LEAD 윈도 함수입니다. 이 함수들은 모든 세부 행을 그대로 유지하면서 현재 행이 이웃 행의 값을 참조하게 합니다. 이 레슨에서는 인접 행 사이를 탐색하는 방식을 정확히 이해하기 위한 사고 모델을 세우게 됩니다.
LAG와 LEAD의 역할
LAG(col)은 col의 이전 행에 있는 값을 반환합니다. LEAD(col)은 다음 행에 있는 값을 반환합니다. "이전"과 "다음"은 전적으로 OVER 절 내부의 ORDER BY가 정합니다.
- LAG는 이전 행을 봅니다.
- LEAD는 다음 행을 봅니다.
둘 다 오프셋 윈도 함수입니다. 행을 합쳐서 줄이지 않고, 현재 행에 이웃 행의 값만 덧붙입니다.
LAG 기본 구문
다음은 전형적인 형태입니다. sales 테이블에 month와 revenue가 있다고 하겠습니다. 각 행에 전월 매출도 표시하려고 합니다.
OVER (ORDER BY month)는 엔진에 "이전"을 정의하는 방법을 알려 줍니다. 첫 번째 행에는 앞선 행이 없으므로 그 행의 prev_revenue는 NULL입니다.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;결과 읽기
데이터가 2024-01 = 100, 2024-02 = 130, 2024-03 = 120인 경우 쿼리는 다음을 반환합니다:
- 1월: 매출 100, prev_revenue NULL
- 2월: 매출 130, prev_revenue 100
- 3월: 매출 120, prev_revenue 130
각 행은 정렬된 집합에서 바로 위 행의 값을 가져왔습니다. 자체 조인도, 하위 쿼리도, 행 손실도 없습니다.
LEAD는 앞을 봅니다
LEAD는 반대 기능입니다. 행이 다음에 무엇이 오는지 알아야 할 때 사용합니다. 예를 들어 다음 구매 날짜를 사용하여 주문 사이의 시간을 계산할 수 있습니다.
정렬된 집합의 마지막 행에는 다음 행이 없으므로 해당 행의 LEAD 결과는 NULL입니다.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;이동량 인수
두 함수 모두 선택적인 두 번째 인수를 받습니다. 이 인수는 몇 행을 건너뛸지 지정합니다. LAG(col, 2)는 두 행 뒤로 이동하고, LEAD(col, 3)은 세 행 앞으로 이동합니다.
면접관은 이를 사용하여 "두 달 전의 매출"이나 "세 행 아래의 값"을 구하라고 질문합니다. 기본 이동량은 1입니다.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;기본값 인수
세 번째 인수는 이웃 행이 없을 때 NULL 대신 사용할 대체 값을 제공합니다. 형식은 LAG(col, offset, default)입니다.
후속 계산에서 NULL을 허용할 수 없을 때 유용합니다. 예를 들어 이전 값이 없을 때 이를 0으로 처리하면 차이를 계속 계산할 수 있습니다.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;PARTITION BY가 윈도를 재설정합니다
실제 데이터에 하나의 전역 시리즈만 있는 경우는 드뭅니다. 보통 고객, 제품 또는 지역별로 비교합니다. PARTITION BY는 각 파티션의 시작점에서 LAG/LEAD 계산을 다시 시작합니다.
따라서 각 파티션의 첫 번째 행은 LAG에서 NULL을 받으며, 경계를 넘어 다른 고객의 데이터로 값이 유출되는 일이 없습니다.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;예제: 주문 간 날짜 차이
자주 수행하는 작업 중 하나는 고객의 연속된 주문 사이의 간격을 측정하는 것입니다. LAG로 이전 주문 날짜를 가져온 다음 뺄셈을 수행합니다.
각 고객의 첫 주문에는 뺄셈을 수행할 이전 날짜가 없으므로 NULL이 반환됩니다. 이는 윈도 함수를 사용해 해결할 것으로 면접관이 기대하는 고객별 비교의 전형적인 예입니다.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;자체 조인을 사용하지 않는 이유
윈도 함수가 없던 시절의 답은 상관 자체 조인이었습니다. 즉, "현재 행보다 날짜가 작은 행 중 가장 큰 날짜를 가진 행"을 기준으로 테이블을 자기 자신과 조인하는 방식입니다. 작동하기는 하지만 표현이 장황하고 동률이 있을 때 오류가 발생하기 쉬우며, 대개 더 느립니다.
LAG/LEAD는 의도를 한 줄로 표현합니다.- 한 번의 정렬된 순회에서 계산됩니다.
- 동률은 사용자가 지정한
ORDER BY에 따라 결정적으로 처리됩니다.
"자체 조인 대신 LAG를 사용하겠습니다"라고 말하면 능숙함을 보여 줄 수 있습니다.
흔한 실수: ORDER BY 누락
OVER 절에 ORDER BY가 없으면 "이전 행"이 무엇인지 정의되지 않습니다. 일부 엔진은 이를 거부하고, 다른 엔진은 예측할 수 없는 결과를 반환합니다. 윈도에 항상 순서를 지정하십시오.
또한 OVER 안의 순서는 질의 바깥쪽 ORDER BY와 독립적이라는 점을 기억하십시오. 윈도는 어떤 행을 이웃으로 볼지 결정하고, 바깥쪽 절은 표시 순서만 결정합니다.
빠른 확인
오프셋 윈도 함수에 대한 이해도를 확인해 보십시오.
복습
이제 오프셋 윈 함수를 알게 되었습니다.
LAG(col)는 이전 행을 읽고,LEAD(col)는 다음 행을 읽습니다. 기준은 윈도의ORDER BY입니다.- 선택적 인수는
LAG(col, offset, default)입니다. PARTITION BY는 그룹별로 탐색을 초기화하므로 경계 행은NULL이 됩니다.- 인접한 행을 비교할 때 번거로운 자체 조인을 대신할 수 있습니다.
다음에는 이를 분석가 면접에서 반드시 나오는 질문인 기간 대비 변화에 적용해 보겠습니다.
자주 묻는 질문
“LAG와 LEAD로 인접한 행 다루기” 강의는 무료인가요?
네 — “LAG와 LEAD로 인접한 행 다루기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“LAG와 LEAD로 인접한 행 다루기”에서 뭘 배우나요?
SELF JOIN 없이 이전 행과 다음 행의 값에 접근합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“LAG와 LEAD로 인접한 행 다루기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- LAG와 LEAD로 인접한 행 다루기
- 기간별 변화
- NTILE로 구간 나누기
- FIRST_VALUE, LAST_VALUE와 프레임 경계