순서가 있는 이벤트와 시간 윈도
윈도 함수를 사용해 단계가 순서대로, 제한 시간 안에 진행되도록 보장합니다.
순서가 있는 이벤트와 시간 윈도은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
순서와 시간이 중요한 이유
이전 수업의 기본 퍼널은 사용자가 각 단계를 수행했는지만 확인합니다. 더 까다로운 면접관은 단계가 올바른 순서로, 그리고 합리적인 시간 안에 발생했는지 묻습니다.
월요일에 구매하고 금요일에 마케팅 페이지를 방문한 사용자는 여러분의 퍼널을 통해 전환한 것이 아닙니다. 순서와 시간을 고려해야 단순한 플래그 기반 퍼널이 신뢰할 수 있는 퍼널이 됩니다.
사용자별 최초 시각을 사용하는 방법
순서를 판단하려면 사용자가 각 단계에 처음 도달한 시각을 기록하십시오. 최초 방문 시각, 최초 가입 시각, 최초 구매 시각을 각각 저장합니다.
그러면 올바른 전환은 first_signup_time >= first_visit_time 등 체인의 각 조건을 만족해야 합니다. 단계별로 그룹화한 MIN(event_time)이 이러한 기준 시각을 제공합니다.
SELECT
user_id,
MIN(CASE WHEN event_name = 'visit' THEN event_time END) AS first_visit,
MIN(CASE WHEN event_name = 'signup' THEN event_time END) AS first_signup,
MIN(CASE WHEN event_name = 'purchase' THEN event_time END) AS first_purchase
FROM events
GROUP BY user_id;단계를 순서대로 요구하기
단계별 최초 시각이 있으면 순서 적용은 비교로 해결됩니다. 사용자가 실제로 3단계까지 전환한 경우는 각 시각이 NULL이 아니고 단조 증가할 때뿐입니다.
NULL인 시각, 즉 해당 단계가 발생하지 않은 경우에는 비교가 자연스럽게 거짓이 된다는 점에 주목하십시오. 바로 원하는 동작입니다.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS signup_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS converted_in_order
FROM t
WHERE visit_t IS NOT NULL
AND signup_t >= visit_t
AND purchase_t >= signup_t;시간 범위 추가하기
대부분의 퍼널에는 마감 기한이 있습니다. 예를 들어 “첫 방문 후 7일 이내에 전환”하는 식입니다. 첫 단계와 마지막 단계 사이에 기간 제한을 추가하십시오.
날짜 계산 방식은 SQL 방언에 따라 다릅니다. Postgres에서는 visit_t + INTERVAL '7 days'로 작성할 수 있고, MySQL에서는 DATE_ADD(visit_t, INTERVAL 7 DAY)를 사용합니다. 사용할 방언을 항상 명시하십시오.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS visit_t,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS purchase_t
FROM events GROUP BY user_id
)
SELECT COUNT(*) AS purchased_within_7d
FROM t
WHERE purchase_t >= visit_t
AND purchase_t < visit_t + INTERVAL '7 days';왜 임의의 시각이 아니라 최초 시각인가
면접에서 자주 나오는 미묘한 지점입니다. 기간의 시작점을 사용자의 첫 방문으로 해야 할까요, 아니면 가입 직전의 가장 최근 방문으로 해야 할까요? 제품 질문의 목적에 따라 다릅니다.
- 첫 접점 기간은 최초 관심부터 전환까지 얼마나 걸렸는지를 측정합니다.
- 마지막 접점 기간은 마지막 방문 이후 전환까지의 짧은 실행 시간을 측정합니다.
면접관이 어느 의미로 말했는지 물어보십시오. 의도적으로 기준을 선택하는 모습은 높은 숙련도를 보여 줍니다.
LEAD를 사용한 이벤트 순서 지정
복잡한 다단계 경로에서는 윈도 함수가 강력합니다. 각 사용자의 이벤트를 시각순으로 정렬한 다음 LEAD를 사용하여 다음 이벤트를 확인하고, 예상한 다음 단계인지 검증하십시오.
이 방법은 단계 사이에 관련 없는 이벤트가 끼어드는 경로도 처리할 수 있습니다.
SELECT
user_id,
event_name,
event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events;예상한 다음 단계와 일치시키기
LEAD를 확장하여 사용하십시오. '방문' 행 바로 다음에 '가입'이 나오는 행만 남깁니다. 이렇게 하면 단순히 함께 발생했는지가 아니라 실제 순차 전환을 찾을 수 있습니다.
이러한 전환 검사를 연결하면 전체 경로가 단계별로 올바른 순서를 따르는지 검증할 수 있습니다.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_name) OVER (PARTITION BY user_id ORDER BY event_time) AS next_event
FROM events
)
SELECT COUNT(DISTINCT user_id) AS visit_then_signup
FROM seq
WHERE event_name = 'visit' AND next_event = 'signup';연속된 단계 사이의 시간
면접관들은 “각 단계에 얼마나 오래 걸리나요?”라는 질문을 좋아합니다. 시각에 LEAD를 적용한 뒤 뺄셈을 하십시오. 연속된 이벤트 사이의 차이가 해당 단계의 체류 시간입니다.
전환별 중앙값이나 평균을 집계하면 퍼널에서 가장 느린 단계를 찾을 수 있습니다.
WITH seq AS (
SELECT user_id, event_name, event_time,
LEAD(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS next_time
FROM events
)
SELECT
event_name,
AVG(EXTRACT(EPOCH FROM (next_time - event_time)) / 3600.0) AS avg_hours_to_next
FROM seq
WHERE next_time IS NOT NULL
GROUP BY event_name;동일한 시각의 예외 상황
두 이벤트가 정확히 같은 event_time을 공유하면 어떻게 될까요? 이 경우 signup_t >= visit_t는 두 이벤트가 동시에 발생했더라도 참이 되며, 시각만으로는 순서를 정할 수 없습니다.
>=와>중 무엇을 사용할지 의도적으로 선택하고 그 이유를 설명하십시오.- 윈도 함수의 결과가 결정적이 되도록 이벤트 순번 ID 같은 동률 해소 기준을
ORDER BY에 추가하십시오.
이 점을 먼저 언급하면 면접관에게 좋은 인상을 줄 수 있습니다.
SELECT user_id, event_name,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time, event_id) AS step_seq
FROM events;한 쿼리에서 순서와 기간 함께 적용하기
다음은 올바른 순서를 지키면서 정해진 기간 안에 완료되는 완전한 퍼널입니다. 첫 방문을 기준으로 삼고, 각 이후 단계의 최초 발생 시각이 바로 앞 단계 이후인지 요구하며, 전체 경로를 7일 이내로 제한합니다.
이 답은 퍼널을 이해하는 지원자와 플래그 수만 세는 지원자를 구분해 줍니다.
WITH t AS (
SELECT user_id,
MIN(CASE WHEN event_name='visit' THEN event_time END) AS v,
MIN(CASE WHEN event_name='signup' THEN event_time END) AS s,
MIN(CASE WHEN event_name='purchase' THEN event_time END) AS p
FROM events GROUP BY user_id
)
SELECT
COUNT(*) FILTER (WHERE v IS NOT NULL) AS visited,
COUNT(*) FILTER (WHERE s >= v AND s < v + INTERVAL '7 days') AS signed_up,
COUNT(*) FILTER (WHERE s >= v AND p >= s AND p < v + INTERVAL '7 days') AS purchased
FROM t;SQL 방언별 참고 사항
실시간 코딩에서 기억할 이식성 관련 사항은 두 가지입니다.
- 집계 함수에 사용하는
FILTER (WHERE ...)는 표준 SQL이며 Postgres에서 동작합니다. MySQL이나 오래된 엔진에서는SUM(CASE WHEN ... THEN 1 ELSE 0 END)으로 대체하십시오. - 기간 구문은 서로 다릅니다. Postgres는
+ INTERVAL '7 days', MySQL은DATE_ADD(d, INTERVAL 7 DAY), SQL Server는DATEADD(day, 7, d)를 사용합니다.
가정을 명시하면 됩니다. 면접관은 보통 어떤 방언을 사용했는지보다 서로 다르다는 사실을 알고 있는지를 중요하게 봅니다.
빠른 확인
첫 방문 후 7일 이내에 방문 -> 가입 -> 구매를 순서대로 완료한 사용자 수를 세어야 합니다. 어떤 접근 방식이 올바릅니까?
복습: 순서가 있는 이벤트와 시간 범위
핵심 내용:
- 각 사용자의 단계별 최초 시각을
MIN(CASE ...)로 기록합니다. - 각 단계의 시각이 이전 단계의 시각과 같거나 이후가 되도록 요구하여 순서를 보장합니다.
- 사용 중인 SQL 방언의 구문을 명시하여 시간 간격으로 경로의 범위를 제한합니다.
- 단계 간 전환 확인과 체류 시간 계산에는
LEAD/LAG를 사용합니다. ORDER BY에 보조 정렬 기준을 추가하여 동일 시각의 동률을 처리합니다.
다음: 퍼널에서 실험으로 전환하고 변형별 지표를 계산합니다.
자주 묻는 질문
“순서가 있는 이벤트와 시간 윈도” 강의는 무료인가요?
네 — “순서가 있는 이벤트와 시간 윈도” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“순서가 있는 이벤트와 시간 윈도”에서 뭘 배우나요?
윈도 함수를 사용해 단계가 순서대로, 제한 시간 안에 진행되도록 보장합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“순서가 있는 이벤트와 시간 윈도” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 다단계 퍼널 만들기
- 순서가 있는 이벤트와 시간 윈도
- A/B 테스트 할당과 지표
- SQL에서의 상승 효과, 유의성 및 안전장치