0Pricing
SQL Interview Prep · 강의

OVER, PARTITION BY와 ORDER BY

윈도 사양의 구조와 PARTITION이 계산을 다시 시작하게 하는 방식을 알아봅니다.

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

면접관이 윈도 함수에 주목하는 이유

윈도 함수는 현재 행과 관련된 행 집합에 대해 계산을 수행하면서도, GROUP BY처럼 행을 합쳐 줄이지는 않습니다. 면접관이 윈도 함수를 선호하는 이유가 바로 이 특성입니다. 모든 상세 행을 유지하면서 집계값, 순위 또는 누적 합계를 함께 표시할 수 있습니다.

  • GROUP BY는 그룹마다 한 행을 반환합니다.
  • 윈도 함수는 모든 입력 행을 반환하고, 계산된 열을 하나 추가합니다.

면접관이 "각 직원과 해당 직원 부서의 평균 급여를 같은 행에 보여 주세요"라고 말한다면, 자기 조인 대신 윈도 함수를 선택하는지 확인하려는 것입니다.

OVER 절의 구조

모든 윈도 함수 뒤에는 OVER (...) 절이 옵니다. 이 절에는 선택적인 부분이 세 가지 있으며, 이를 정확히 설명하면 면접관에게 좋은 인상을 줄 수 있습니다:

  • PARTITION BY — 행을 그룹으로 나누며, 함수는 각 그룹에서 다시 시작합니다.
  • ORDER BY — 각 그룹 안에서 행의 순서를 정합니다(순위와 누적 합계에 필요합니다).
  • 프레임 — 계산에 사용할 행을 제한합니다(ROWS/RANGE).

빈 OVER ()는 전체 결과 집합을 하나의 그룹으로 취급합니다.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

윈도 함수와 집계 함수: 같은 함수, 다른 결과

정확히 같은 집계 함수도 윈도 함수로 사용하면 다르게 동작합니다. 아래 두 쿼리를 개념적으로 비교해 보세요.

  • AVG(salary)와 GROUP BY department를 함께 사용하면 부서마다 한 행을 반환합니다.
  • AVG(salary) OVER (PARTITION BY department)를 사용하면 모든 직원을 반환하고, 각 직원의 행에 부서 평균을 함께 표시합니다.

면접 요령: 윈도 함수 버전은 GROUP BY가 필요하지 않으며 중복된 상세 행을 제거하지 않는다는 점을 강조하세요.

-- Aggregate: collapses
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

-- Window: preserves every row
SELECT department, name, AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

PARTITION BY: 계산 재설정

PARTITION BY는 집계 함수에서 GROUP BY와 같은 역할을 윈도 함수에서 수행하지만, 행을 하나로 합치지는 않습니다. 서로 다른 각 파티션 값마다 독립적인 계산이 수행됩니다.

이 예제에서는 부서마다 행 번호가 1부터 다시 시작합니다. PARTITION BY가 없으면 모든 직원에 걸쳐 번호가 연속해서 매겨집니다.

  • 열 하나 또는 여러 열을 기준으로 파티션을 나눌 수 있습니다.
  • PARTITION BY가 없으면 전체 집합이 하나의 거대한 파티션이 됩니다.
SELECT
  department,
  name,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

OVER 내부의 ORDER BY

OVER 내부의 ORDER BY는 쿼리의 최종 ORDER BY와 같지 않습니다. 함수가 처리할 각 파티션 내부의 행 순서만 정의합니다.

  • 순위 함수(ROW_NUMBER, RANK)에는 이 절이 필수입니다 — 순위를 매길 순서가 필요하기 때문입니다.
  • 파티션에 적용하는 일반 집계 함수에는 누적 계산을 원하지 않는 한 이 절이 필요하지 않습니다.

면접에서 흔히 하는 실수는 윈도의 ORDER BY와 출력 결과의 표시 순서를 혼동하는 것입니다.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS seniority_rank
FROM employees
ORDER BY name;  -- output order is independent of the window order

PARTITION BY와 ORDER BY 결합

대표적인 순위 윈도는 두 절을 함께 사용합니다. PARTITION BY로 그룹을 나눈 다음 ORDER BY로 각 그룹 내부의 순서를 정합니다.

아래 사양은 다음과 같이 읽으면 됩니다. "각 부서 안에서 직원을 급여 내림차순으로 정렬하고 번호를 매깁니다." 모든 부서에서 급여가 가장 높은 직원은 행 번호 1을 받습니다.

이 하나의 사양은 그룹별 상위 N개를 포함해 가장 흔한 윈도 함수 면접 문제의 핵심입니다.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_salary_rank
FROM employees;

ORDER BY가 집계 동작을 변경하는 방식

면접관이 확인하는 미묘한 지점이 있습니다. 집계 윈도에 ORDER BY를 추가하면 암시적 범위("파티션의 시작부터 현재 행까지")가 적용되므로 누적 계산으로 바뀝니다.

  • SUM(x) OVER (PARTITION BY g) → 모든 행에 같은 그룹 합계가 표시됩니다.
  • SUM(x) OVER (PARTITION BY g ORDER BY d) → 현재 행까지의 누적 합계가 표시됩니다.

ORDER BY가 암시적으로 범위를 추가한다는 사실을 아는지가 중급 지원자와 초급 지원자를 가르는 기준이 됩니다.

SELECT
  account_id,
  txn_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY account_id
    ORDER BY txn_date
  ) AS running_balance
FROM transactions;

윈도 함수가 허용되는 위치

윈도 함수는 SELECT 목록과 ORDER BY 절에만 사용할 수 있습니다. WHERE, GROUP BY, HAVING에서는 사용할 수 없습니다.

그 이유는 논리적 실행 순서와 관련이 있습니다. 윈도 함수는 WHERE, GROUP BY, HAVING이 실행된 후에 평가됩니다. 윈도가 행을 보기 전에 이미 행이 선택되는 것입니다.

따라서 순위로 필터링하려면 하위 쿼리나 CTE가 필요합니다. 이 내용은 뒤의 수업에서 자세히 다룹니다.

-- This FAILS: window function in WHERE
-- SELECT name FROM employees
-- WHERE ROW_NUMBER() OVER (ORDER BY salary) = 1;

-- This works: window in SELECT, filter outside
SELECT * FROM (
  SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

하나의 쿼리에서 사용하는 여러 윈도 함수

같은 SELECT에서 여러 윈도 함수를 사용할 수 있으며, 각 함수가 자체 사양을 사용하거나 하나의 사양을 공유할 수 있습니다. 데이터베이스는 파티션된 데이터를 한 번 순회하며 이 함수들을 계산합니다.

면접에서 순위와 부서 평균을 함께 구해야 할 때 유용합니다. 두 함수가 같은 사양을 공유한다면 일부 SQL 방언에서는 WINDOW 절로 사양에 이름을 지정해 반복을 피할 수 있습니다.

SELECT
  name,
  department,
  salary,
  ROW_NUMBER() OVER w  AS rn,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);

예제 풀이: 급여와 부서 평균 비교

분석가에게 자주 나오는 질문은 다음과 같습니다. "모든 직원의 급여, 부서 평균, 그리고 그 차이를 나열하세요." 윈도 표현식 하나로 핵심 계산을 처리하고 나머지는 산술 연산으로 구할 수 있습니다.

GROUP BY가 없으며 모든 직원 행이 그대로 남는다는 점에 주목하세요. dept_avg가 같은 부서의 모든 직원에게 반복되므로 행마다 비교할 수 있습니다.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg
FROM employees
ORDER BY department, salary DESC;

면접관이 주의 깊게 보는 일반적인 실수

윈도 함수가 등장했을 때 다음과 같은 함정을 피해야 합니다.

  • WHERE나 HAVING에 윈도 함수를 넣는 것 — 허용되지 않으므로 하위 쿼리를 사용해야 합니다.
  • 순위 함수에서 ORDER BY를 빠뜨리는 것 — 결과 순서가 임의로 정해집니다.
  • PARTITION BY가 행 수를 줄인다고 생각하는 것 — 절대로 행을 줄이지 않습니다.
  • 윈도의 ORDER BY와 최종 출력 순서를 혼동하는 것.
  • 집계 윈도에 ORDER BY를 추가하고 누적 합계로 바뀐 사실을 알아차리지 못하는 것.

빠른 확인

윈도 사양에 대한 이해도를 확인해 보세요.

복습: 윈도 사양

이제 OVER (...)의 구조를 익혔습니다.

  • 윈도 함수는 관련 행 전체를 대상으로 계산하면서도 모든 행을 유지합니다.
  • PARTITION BY는 그룹을 나누고 계산을 다시 시작하지만, 행을 제거하지는 않습니다.
  • ORDER BY는 파티션 내부의 행 순서를 정합니다. 순위 함수에는 필수이며 집계 함수를 누적 계산으로 바꿉니다.
  • 윈도 함수는 SELECT와 ORDER BY에서만 사용할 수 있으며, WHERE/HAVING에서는 사용할 수 없습니다.

다음에는 ROW_NUMBER로 결정적인 순서 번호를 지정하는 방법을 알아봅니다.

자주 묻는 질문

“OVER, PARTITION BY와 ORDER BY” 강의는 무료인가요?

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

“OVER, PARTITION BY와 ORDER BY”에서 뭘 배우나요?

윈도 사양의 구조와 PARTITION이 계산을 다시 시작하게 하는 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“OVER, PARTITION BY와 ORDER BY” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. OVER, PARTITION BY와 ORDER BY
  2. ROW_NUMBER로 고유한 순서 부여하기
  3. 동점 상황에서 RANK와 DENSE_RANK 비교하기
  4. 윈도 결과로 필터링하기
← SQL Interview Prep(으)로 돌아가기