0Pricing
Coding Interview Prep · 강의

숫자 및 날짜 계열 생성하기

재귀를 사용해 누락 구간을 채우고 달력을 만드는 계열을 생성합니다.

숫자 및 날짜 계열 생성하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

계층 구조 없는 재귀

재귀 CTE는 트리에서만 사용하는 것이 아닙니다. 두 번째 주요 용도는 수열 생성입니다. 숫자가 이어지는 수열이나 범위의 모든 날짜를 만들 수 있습니다. 면접관은 어떤 테이블에도 존재하지 않는 행을 만들어 빈 구간 채우기가 필요한 문제에서 이를 질문합니다.

전형적인 질문은 다음과 같습니다. "매출이 0인 날도 포함하여 해당 월의 일별 매출을 보여 주세요." 누락된 날짜를 먼저 모두 생성하지 않으면 빠진 날짜를 표시할 수 없습니다.

간단한 숫자 수열

앵커는 첫 숫자를 지정하고, 재귀 멤버는 반복마다 1을 더하며, 재귀 멤버의 WHERE가 재귀를 멈춥니다. 이 방식으로 1부터 10까지 생성합니다.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;

종료 조건식

조직도와 달리 숫자 수열에는 멈출 자연스러운 말단 노드가 없습니다 — 숫자를 무한히 증가시킬 수 있기 때문입니다. 따라서 재귀 멤버에 명시적인 종료 조건식을 추가해야 합니다: WHERE n < 10.

n이 10에 도달하면 다음 반복의 WHERE가 유일한 후보 행을 걸러 내고, 재귀 멤버는 아무것도 반환하지 않으므로 재귀가 중단됩니다. 이 보호 조건을 빠뜨리는 것이 면접에서 무한 재귀가 발생하는 가장 흔한 원인입니다.

범위 매개변수화

값이나 변수로 상한을 정하면 수열을 유연하게 만들 수 있습니다. 여기서는 입력받은 N까지 1부터 생성합니다. 앵커와 증가량만 바꾸면 0부터 시작하는 수열이나 일정한 간격의 수열도 같은 형태로 만들 수 있습니다.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums;  -- odd numbers 1,3,5,...,99

날짜 수열 생성

정수 연산을 날짜 연산으로 바꾸면 달력이 됩니다. 앵커는 시작 날짜이고, 재귀 멤버는 종료 날짜를 지날 때까지 하루를 더합니다.

하루를 더하는 구문은 SQL 방언마다 다릅니다 — 이 PostgreSQL 스타일 형식은 INTERVAL을 사용합니다.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day'
    FROM cal
    WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;

LEFT JOIN으로 빈 구간 채우기

이제 달력과 실제 데이터를 결합합니다. 모든 날짜를 생성한 다음 판매 테이블을 LEFT JOIN하면 누락된 날짜가 NULL로 나타나며, 이를 COALESCE로 0으로 바꿀 수 있습니다.

기준 축을 생성한 다음 사실 데이터를 왼쪽 조인하는 이 두 단계의 패턴이 모든 빈 구간 채우기 답변의 핵심입니다.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day' FROM cal
    WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;

월별 및 주별 기준 축

증가량을 바꾸면 더 긴 간격의 달력을 만들 수 있습니다. INTERVAL '1 month'를 추가하면 월별 기준 축이 되고, INTERVAL '7 day'를 추가하면 주별 기준 축이 됩니다. 빈 달도 포함하는 월별 보고서를 면접관이 원할 때 유용합니다.

WITH RECURSIVE months AS (
    SELECT DATE '2024-01-01' AS m
    UNION ALL
    SELECT m + INTERVAL '1 month' FROM months
    WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;

날짜 연산의 SQL 방언별 차이

날짜 산술은 이러한 쿼리에서 이식성이 가장 낮은 부분입니다. 다음과 같은 변형을 알아 두셔야 합니다:

  • PostgreSQL: d + INTERVAL '1 day'.
  • MySQL: DATE_ADD(d, INTERVAL 1 DAY).
  • SQL 서버: DATEADD(DAY, 1, d).
  • SQLite: date(d, '+1 day').

재귀 구조는 동일하고 날짜 함수만 달라진다고 언급하면, SQL 방언의 차이를 이해하고 있다는 점을 보여 주는 강력한 답변이 됩니다.

재귀와 수열 생성 함수 비교

PostgreSQL에는 재귀 없이 숫자나 날짜를 생성하는 기본 제공 generate_series()가 있으며, 더 빠르고 명확합니다:

SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');

면접에서 사용하는 데이터베이스가 이를 지원한다면 우선 사용하세요. 하지만 많은 엔진에는 이 기능이 없습니다(MySQL 및 최신 버전 이전의 SQL 서버 등) — 바로 이런 경우에 재귀 CTE가 이식 가능한 대체 수단이 됩니다.

재귀 한도 확인

큰 수열을 생성하면 엔진의 재귀 상한에 도달할 수 있습니다. SQL 서버의 기본값은 MAXRECURSION 100이므로, OPTION (MAXRECURSION 0)을 덧붙여 한도를 해제하지 않으면 365일 달력 생성이 실패합니다.

PostgreSQL에는 고정 상한이 없지만, 잘못된 조건식으로 끝없이 생성되는 수열은 메모리가 고갈될 때까지 실행될 수 있습니다. 규모를 키우기 전에 종료 조건식이 올바른지 항상 확인하셔야 합니다.

-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);

수열과 CROSS JOIN하기

생성된 수열은 종종 재료에 불과합니다. 숫자 CTE가 있으면 CROSS JOIN하여 행을 확장하거나 펼칠 수 있습니다 — 예를 들어 각 주문 행을 수량만큼 반복하거나, 날짜 범위를 고객별로 확장할 수 있습니다.

재귀가 최종 답변만이 아니라 재사용 가능한 구성 요소를 만든다는 점을 이해하는 것이, 기계적으로 답하는 것과 완성도 높은 면접 답변을 가르는 차이입니다.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;

간단 확인

숫자나 날짜 수열에서 종료 조건식이 중요한 이유는 무엇입니까?

복습

재귀는 어떤 테이블에도 존재하지 않는 행을 만들어 낼 수 있습니다:

  • 앵커에서 첫 값을 지정하고, 재귀 멤버에서 값을 증가시킵니다.
  • 수열에는 자연스러운 끝이 없으므로 항상 명시적인 종료 조건식을 추가합니다.
  • 날짜 또는 숫자 기준 축을 만든 다음, 사실 데이터에 LEFT JOIN하고 빈 구간을 채우기 위해 COALESCE를 사용합니다.
  • 사용할 수 있다면 generate_series를 우선 사용하고, SQL 서버에서는 MAXRECURSION에 유의합니다.

다음: 재귀가 끝없이 실행되지 않도록 하는 안전 기법입니다.

자주 묻는 질문

“숫자 및 날짜 계열 생성하기” 강의는 무료인가요?

네 — “숫자 및 날짜 계열 생성하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“숫자 및 날짜 계열 생성하기”에서 뭘 배우나요?

재귀를 사용해 누락 구간을 채우고 달력을 만드는 계열을 생성합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“숫자 및 날짜 계열 생성하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 앵커 및 재귀 구성원
  2. 조직도 순회하기
  3. 숫자 및 날짜 계열 생성하기
  4. 무한 재귀 방지하기
← Coding Interview Prep(으)로 돌아가기