계열에서 누락 구간 찾기
누락된 값과 각 구간의 시작과 끝을 감지합니다.
계열에서 누락 구간 찾기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
이제 누락 구간을 찾습니다
지금까지는 행을 연속 구간으로 그룹화했습니다. 이에 대한 반대 방향의 면접 질문은 어떤 값이 누락되었는가?입니다. 면접관은 이를 “이 ID 수열에서 누락 구간을 찾으십시오”, “건너뛴 청구서 번호는 무엇입니까”, 또는 “활동이 없었던 날짜는 언제입니까”와 같이 표현합니다.
누락 구간은 연속 구간 사이의 빈 공간입니다. 핵심은 일반적으로 누락된 값을 하나씩 모두 나열할 필요가 없다는 점입니다. 대신 각 누락 범위의 시작값과 끝값을 보고하면 되며, 이것이 훨씬 간결하고 면접관이 기대하는 결과입니다.
예시 누락 구간 데이터셋
seq(n) 테이블에 있는 현재 값 1, 2, 3, 7, 8, 10을 다시 사용하겠습니다. 보고해야 할 누락 구간은 다음과 같습니다.
- 4부터 6까지: 첫 번째 연속 구간 뒤, 7 앞
- 9부터 9까지: 8과 10 사이
누락을 범위로 표현한다는 점에 주목하십시오. 누락 시작값 = 마지막으로 존재하는 값 + 1, 누락 끝값 = 다음으로 존재하는 값 - 1입니다. 아래의 핵심 기법은 바로 이 간결한 형식을 얻는 것이 목표입니다.
CREATE TABLE seq (n INT);
INSERT INTO seq VALUES (1),(2),(3),(7),(8),(10);LEAD 방식으로 누락 찾기
가장 깔끔하게 누락을 찾는 방법은 LEAD를 사용하여 각 행을 다음 행과 비교하는 것입니다. 다음 값이 현재 값보다 1 초과로 크면 두 값 사이에 누락 구간이 있습니다.
이러한 각 행에서 누락은 n + 1에서 시작하여 next_n - 1에서 끝납니다. 먼저 가공하지 않은 LEAD 결과를 살펴보십시오.
SELECT
n,
LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
ORDER BY n;누락 범위 보고하기
LEAD 결과를 CTE로 감싸고 다음 값으로의 증가 폭이 1보다 큰 행만 남깁니다. 이 행들이 누락 구간을 나타냅니다.
그러면 정확히 4-6과 9-9 누락 구간이 반환됩니다. next_n - n - 1 식은 각 누락 구간에서 누락된 값의 개수도 제공하므로 자주 나오는 추가 질문에 활용할 수 있습니다.
WITH stepped AS (
SELECT n, LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
)
SELECT
n + 1 AS gap_start,
next_n - 1 AS gap_end,
next_n - n - 1 AS missing_count
FROM stepped
WHERE next_n - n > 1
ORDER BY gap_start;대칭적인 LAG 방식
대신 LAG로 이전 행을 살펴보아 같은 누락 구간을 찾을 수도 있습니다. 이전 값이 현재 값보다 1 초과로 작으면 현재 행 앞에 누락 구간이 있습니다.
두 방법은 완전히 같습니다. 질문에 더 자연스럽게 읽히는 방법을 선택하십시오. 일부 면접관은 누락 구간을 그 앞의 행을 기준으로 설명하는 방식이 사람들이 말하는 방식과 더 잘 맞는다는 이유로 LEAD를 선호합니다.
WITH stepped AS (
SELECT n, LAG(n) OVER (ORDER BY n) AS prev_n
FROM seq
)
SELECT prev_n + 1 AS gap_start,
n - 1 AS gap_end
FROM stepped
WHERE n - prev_n > 1
ORDER BY gap_start;누락된 값을 하나씩 나열하기
때로는 면접관이 범위가 아니라 누락된 숫자의 전체 목록을 요구하기도 합니다. 이때 가장 견고한 방법은 예상되는 전체 수열을 생성한 뒤, 실제로 존재하는 값과 반조인하는 것입니다. Postgres에서는 generate_series로 전체 범위를 만들 수 있습니다.
seq에 존재하지 않는 예상 범위 내의 모든 정수가 누락된 값입니다. 의도한 최솟값과 최댓값을 알고 있다면 이 방법은 양 끝에 있는 누락도 처리합니다.
SELECT g.n AS missing_value
FROM generate_series(
(SELECT MIN(n) FROM seq),
(SELECT MAX(n) FROM seq)
) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL
ORDER BY g.n;데이터베이스별 수열 생성
모든 엔진에 generate_series가 있는 것은 아닙니다. 다음 대안을 알아 두십시오.
- 포스트그레스:
generate_series(1, 100) - 에스큐엘 서버: 재귀 CTE 또는 숫자 테이블
- MySQL 8: 최댓값까지 세어 가는 재귀 CTE
재귀 CTE는 이식 가능한 대체 방법입니다. 반조인에 사용할 동일한 예상 수열을 생성합니다.
WITH RECURSIVE nums AS (
SELECT (SELECT MIN(n) FROM seq) AS n
UNION ALL
SELECT n + 1 FROM nums
WHERE n + 1 <= (SELECT MAX(n) FROM seq)
)
SELECT nums.n AS missing_value
FROM nums
LEFT JOIN seq s ON s.n = nums.n
WHERE s.n IS NULL;달력 날짜의 누락 찾기
누락된 날짜를 찾으려면 하루 간격으로 전체 달력을 생성한 뒤 반조인하십시오. 이것은 “주문이 없었던 날짜는 언제인가”를 찾는 표준 쿼리입니다.
실제 날짜에 LEAD를 적용하여 개별 날짜가 아니라 누락된 날짜의 범위를 보고하는 방식과 결합할 수도 있습니다. 이때 경계에는 + INTERVAL '1 day'를 사용합니다.
SELECT d::date AS missing_day
FROM generate_series(
DATE '2026-01-01', DATE '2026-01-31',
INTERVAL '1 day') AS d
LEFT JOIN daily_logins l ON l.login_date = d::date
WHERE l.login_date IS NULL
ORDER BY missing_day;데이터 범위 바깥의 누락
미묘한 함정이 있습니다. LEAD/LAG는 존재하는 값 사이의 누락만 찾습니다. 현재 존재하는 최솟값보다 앞이나 최댓값보다 뒤에 숫자가 누락되어 있어도 이 윈도 함수 방식으로는 이웃 행이 없기 때문에 찾을 수 없습니다.
면접관이 예상되는 전체 범위, 예를 들어 ID 1부터 100까지를 정의했는데 데이터가 5에서 시작한다면, 데이터 자체의 최솟값과 최댓값이 아니라 지정된 범위를 기준으로 한 수열 생성 반조인을 사용해야 합니다. 예상 경계가 고정되어 있는지 항상 확인하십시오.
SELECT g.n AS missing_value
FROM generate_series(1, 100) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL;그룹별 누락 탐지
사용자별 누락을 찾으려면 그룹 열로 PARTITION BY하여 LEAD/LAG를 적용하십시오. 그러면 서로 다른 사용자의 흐름 사이에서 누락이 보고되는 일이 없습니다.
각 사용자의 누락 범위가 독립적으로 계산됩니다. 연속 구간을 찾을 때와 마찬가지로 PARTITION을 빠뜨리면 사용자들이 조용히 합쳐져 서로 관련 없는 행을 가로지르는 가짜 누락 구간이 만들어집니다.
WITH stepped AS (
SELECT user_id, n,
LEAD(n) OVER (PARTITION BY user_id ORDER BY n) AS next_n
FROM seq_per_user
)
SELECT user_id, n + 1 AS gap_start, next_n - 1 AS gap_end
FROM stepped
WHERE next_n - n > 1
ORDER BY user_id, gap_start;올바른 누락 탐지 방법 선택하기
면접에서 사용할 판단 기준은 다음과 같습니다.
- 간결한 범위만 필요하고 데이터 내부의 누락만 찾는다면
LEAD/LAG를 사용하고 증가 폭이 1보다 큰 경우만 필터링하십시오. - 누락된 개별 값을 모두 원하거나 데이터 양 끝 바깥의 누락까지 찾아야 한다면, 지정된 전체 범위를 기준으로 수열 생성 반조인을 사용하십시오.
두 방법을 모두 언급하고 각각 언제 적용되는지 설명하면 깊은 이해를 보여 줄 수 있습니다. LEAD 방식은 비용이 적고, 수열 방식은 더 완전합니다.
빠른 확인
끝부분을 처리할 때 생기는 함정을 정확히 이해하십시오.
복습: 누락 찾기
이제 누락 탐지를 정리해 보겠습니다.
- 누락은 범위로 보고합니다. 누락 시작값 = 값 + 1, 누락 끝값 = 다음 값 - 1입니다.
- 증가 폭이 1보다 큰 행만 남기도록
LEAD또는 대칭적인LAG를 필터링하면 데이터 내부의 누락을 저렴하게 찾을 수 있습니다. - 수열 생성 반조인은 누락된 모든 값을 나열하고 지정된 범위를 기준으로 양 끝의 누락도 찾습니다.
generate_series가 없는 곳에서는 재귀 CTE로 수열을 생성합니다.- 사용자별 누락을 찾으려면 그룹 열로 PARTITION합니다.
- 예상되는 경계를 항상 확인하십시오.
마지막으로 날짜와 상태의 변화로 정의되는 가장 풍부한 형태의 연속 구간을 다루겠습니다.
자주 묻는 질문
“계열에서 누락 구간 찾기” 강의는 무료인가요?
네 — “계열에서 누락 구간 찾기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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개 중 3번째 강의입니다.
“계열에서 누락 구간 찾기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 갭과 아일랜드 문제 인식하기
- 행 번호 차이 기법
- 계열에서 누락 구간 찾기
- 날짜와 상태 변화가 있는 아일랜드