누적 분포와 전체 대비 비율
파티션 안에서 누적 백분율과 전체 대비 비중을 계산합니다.
누적 분포와 전체 대비 비율은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
전체 대비 백분율에 관한 질문
보고 관련 면접에서 자주 나오는 질문입니다. "각 범주는 전체 매출의 몇 퍼센트를 차지합니까?" 그리고 그 누적형 질문인 "전체 대비 누적 비율은 얼마입니까?"입니다.
핵심은 각 행의 값을 전체 분할 영역에 대해 계산한 윈도우 집계값으로 나누는 것입니다. 자체 조인 없이 윈도우 함수로 총합을 넣을 수 있다는 점이 평가 대상인 통찰입니다.
ORDER BY가 없는 윈도우 SUM = 총합
핵심 방법은 다음과 같습니다. 비어 있는 OVER와 ORDER BY 없음을 사용하는 SUM(amount) OVER ()은 전체 결과 집합의 총합을 반환하고 모든 행에 반복합니다.
ORDER BY가 없으므로 누적 프레임도 없으며, 기본 프레임은 전체 분할 영역입니다. 모든 행에 표시되는 이 총합이 전체 대비 백분율에 필요한 바로 그 분모입니다.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;전체 대비 백분율 계산하기
행의 값을 윈도우로 계산한 총합으로 나눈 뒤 100을 곱하십시오. 정수 나눗셈으로 값이 잘리지 않도록 십진수로 변환해야 합니다.
이 단일 패스 쿼리는 총합을 구하는 하위 쿼리를 세부 행에 다시 조인하던 기존 방식을 대체합니다. 더 짧고 빠르며 읽기도 쉽습니다.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;정수 나눗셈의 함정
전형적인 면접 함정입니다. 많은 데이터베이스에서 정수 열의 amount / total은 정수 나눗셈을 수행하므로 1보다 작은 결과가 0이 됩니다.
먼저 100.0이라는 숫자 리터럴을 곱하거나, 피연산자 하나를 변환해 해결하십시오. 예를 들어 amount::numeric / total처럼 작성할 수 있습니다. 이를 잊으면 0으로만 된 열이 반환되며, 면접관은 이를 즉시 알아챕니다.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;그룹 내 전체 대비 백분율
PARTITION BY를 추가하면 각 행의 비율을 전체 테이블이 아니라 해당 그룹을 기준으로 계산할 수 있습니다. 예를 들어 각 제품이 자신이 속한 지역의 매출에서 차지하는 백분율을 구할 수 있습니다.
이제 SUM(amount) OVER (PARTITION BY region)이라는 분모가 지역별로 다시 시작하므로 각 지역의 백분율 합계는 100이 됩니다.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;전체 대비 누적 백분율
누적 분자와 고정된 분모를 결합하면 전체 대비 누적 비율을 구할 수 있습니다. 즉, 각 행까지 전체 합계 중 얼마가 누적되었는지를 나타냅니다.
분자는 ORDER BY를 사용해 누적하고, 분모는 비어 있는 OVER ()를 사용해 총합을 구합니다. 마지막 행은 항상 100%에 도달합니다.
SELECT
sale_date,
amount,
ROUND(
100.0 * SUM(amount) OVER (ORDER BY sale_date)
/ SUM(amount) OVER (),
2
) AS running_pct
FROM daily_sales;CUME_DIST: 누적 분포
SQL에는 누적 분포를 계산하는 내장 함수인 CUME_DIST()가 있습니다. 이 함수는 현재 행의 ORDER BY 값 이하인 행의 비율을 반환하며, 결과는 (0, 1] 범위의 숫자입니다.
금액의 수동 누적 비율과 달리 CUME_DIST는 행의 위치를 다룹니다. 즉, "이 값 이하인 행은 전체의 몇 비율인가?"라는 질문에 답하며, 백분위수 형태의 보고에 유용합니다.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK와 차이점
비슷한 함수로 PERCENT_RANK()가 있으며, (rank - 1) / (total_rows - 1)로 정의되고 0에서 1까지의 값을 반환합니다.
면접에서 구분해야 할 점은 다음과 같습니다. CUME_DIST는 현재 행을 분자에 포함하므로 "현재 값 이하"를 의미하는 반면, PERCENT_RANK는 첫 번째 행을 0으로 시작하는 상대 순위입니다. 두 함수는 서로 다른 값을 반환하며, 혼동하는 것이 흔한 실수입니다.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;파레토 / 80-20 분석
전체 대비 누적 백분율은 파레토 분석을 가능하게 합니다. "어떤 상위 고객들이 매출의 80%를 차지합니까?"라는 질문에 답하려면 금액을 기준으로 내림차순 정렬하고 누적 비율을 계산한 다음, 누적 비율이 처음 80%를 넘는 지점까지 필터링하십시오.
윈도우 함수의 결과는 WHERE에 직접 사용할 수 없으므로 계산을 CTE로 감싸고 바깥 쿼리에서 필터링하십시오. 이는 모든 윈도우 함수에 적용되는 동일한 규칙입니다.
WITH ranked AS (
SELECT
customer_id,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER () AS running_share
FROM customer_revenue
)
SELECT *
FROM ranked
WHERE running_share <= 0.80;반올림 및 합계 조정
주의하세요. 각 백분율을 소수점 이하 2자리로 반올림하면 열의 합계가 정확히 100이 아니라 99.99 또는 100.01이 될 수 있습니다. 면접관은 각 부분의 합계가 전체와 일치하도록 어떻게 보장하는지 물을 수 있습니다.
일반적인 답변은 표시할 때만 반올림하고 계산에는 전체 정밀도를 유지하거나, 가장 큰 나머지 조정을 한 행에 적용하는 것입니다. 수정 방법보다 문제를 정확히 언급하는 것이 더 중요합니다.
면접 요약 핵심
말로 설명할 핵심 내용:
SUM(x) OVER ()에서 ORDER BY가 없으면 모든 행에 전체 합계가 표시됩니다.- 정수 나눗셈을 피하려면
100.0을 곱합니다. - 그룹별 비율에는
PARTITION BY를 사용합니다. - 전체 합계를 분모로 하는 누적 분자는 누적 비율을 만듭니다.
- 분포에는
CUME_DIST와PERCENT_RANK를 사용하며, 두 함수의 차이를 알고 있어야 합니다. - 파레토/임계값 필터링을 위해 CTE로 감쌉니다.
빠른 확인
전체 결과 집합의 전체 합계를 모든 행에서 얻으려면 어떻게 해야 합니까?
복습: 분포 및 전체 대비 백분율
전체 대비 백분율은 행의 값을 모든 행에 반환되는 전체 합계인 SUM(x) OVER ()로 나눈 값입니다. 정수 나눗셈을 피하려면 항상 100.0을 곱하고, 그룹별 비율에는 PARTITION BY를 추가합니다. 전체 합계를 분모로 하는 누적 분자는 100%에서 끝나는 누적 비율을 만들며, 이는 파레토 분석의 기반이 됩니다.
순위 기반 분포에는 CUME_DIST와 PERCENT_RANK를 사용하고, 반올림과 합계 조정 시 주의 사항을 기억하십시오. 이것으로 누적 합계와 이동 평균을 마칩니다.
자주 묻는 질문
“누적 분포와 전체 대비 비율” 강의는 무료인가요?
네 — “누적 분포와 전체 대비 비율” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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개 중 4번째 강의입니다.
“누적 분포와 전체 대비 비율” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 윈도 프레임으로 누적 합계 계산하기
- ROWS와 RANGE 프레임 비교하기
- 이동 윈도에서 이동 평균 계산하기
- 누적 분포와 전체 대비 비율