0Pricing
Coding Interview Prep · 강의

GROUP BY 없이 그룹별 집계하기

상관 하위 쿼리를 사용해 상세 행과 함께 그룹 최댓값을 계산합니다.

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

세부 정보와 집계값을 함께 보여 주는 문제

면접에서 자주 나오는 질문은 다음과 같습니다. "모든 행을 해당 그룹의 집계값과 함께 보여 주세요." 예를 들어 각 직원을 같은 행에 해당 부서의 최대 급여와 함께 나열하는 것입니다.

일반적인 GROUP BY는 행을 하나로 합치므로 직원별 세부 정보를 유지할 수 없습니다. 세부 행과 그룹 수준의 숫자를 함께 가져와야 합니다.

상관 서브쿼리를 사용하면 아무것도 합치지 않고 각 세부 행에 대해 그룹 집계값을 계산할 수 있어 이 문제를 깔끔하게 해결합니다.

일반적인 GROUP BY가 여기서 실패하는 이유

SELECT dept_id, MAX(salary) FROM employees GROUP BY dept_id를 작성하면 부서마다 한 행만 반환되므로 개별 직원의 이름이 사라집니다.

SELECT에 name을 추가하면서 GROUP BY에는 추가하지 않으면 전형적인 "열은 GROUP BY에 나타나야 합니다." 오류가 발생합니다.

면접관은 여러분이 GROUP BY가 행의 개수를 줄인다는 사실을 이해하는지 확인합니다. 세부 행을 유지하려면 다른 방식으로 집계값을 계산해야 합니다.

상관 서브쿼리로 해결하기

그룹 집계값을 상관 서브쿼리로 만들어 SELECT 목록에 배치하십시오. 각 직원 행이 해당 직원의 부서에 한정된 내부 MAX 계산을 실행합니다.

e2.dept_id = e1.dept_id라는 상관 조건이 집계값을 올바른 그룹에 연결하는 동안, 외부 쿼리는 여전히 직원마다 한 행을 반환합니다.

SELECT e1.name,
       e1.dept_id,
       e1.salary,
       (SELECT MAX(e2.salary)
        FROM employees e2
        WHERE e2.dept_id = e1.dept_id) AS dept_max_salary
FROM employees e1;

각 행을 해당 그룹과 비교하기

그룹 집계값을 쿼리에 넣고 나면 각 행을 그 값과 비교할 수 있습니다. 자주 나오는 질문은 다음과 같습니다. "부서 평균보다 많이 받는 직원을 찾으세요."

여기서는 상관 AVG를 WHERE에 사용하므로 각 직원이 자신이 속한 부서의 평균과 비교됩니다.

SELECT e1.name, e1.dept_id, e1.salary
FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

그룹과의 차이 계산하기

각 행이 그룹 집계값에서 얼마나 떨어져 있는지도 보여 줄 수 있습니다. 상관 평균을 빼면 행마다 차이값을 얻습니다.

같은 상관 서브쿼리를 여러 SELECT 식에서 재사용할 수 있다는 점에 주목하십시오. 엔진은 서브쿼리가 나타날 때마다 행별로 이를 계산합니다.

SELECT e1.name,
       e1.salary,
       e1.salary - (SELECT AVG(e2.salary)
                    FROM employees e2
                    WHERE e2.dept_id = e1.dept_id) AS gap_from_dept_avg
FROM employees e1;

그룹별 최고 수입자 찾기

부서마다 급여가 가장 높은 사람만 반환하려면 각 급여를 상관 MAX와 비교하고 일치하는 행을 남기십시오.

이 방식은 공동 1위를 모두 반환합니다. 두 직원이 부서의 최댓값을 공유하면 둘 다 나타납니다. 이런 동점 처리 방식은 면접관이 자주 이어서 묻는 질문입니다.

SELECT e1.name, e1.dept_id, e1.salary
FROM employees e1
WHERE e1.salary = (
    SELECT MAX(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

윈도 함수 대안

최신 SQL에는 더 깔끔한 도구인 윈도 함수가 있습니다. MAX(salary) OVER (PARTITION BY dept_id)는 행을 합치지 않고 상관 관계에 따른 재탐색도 없이 그룹 집계값을 계산합니다.

두 가지 해결책을 모두 제시하고, 윈도 버전이 보통 테이블을 한 번만 순회하기 때문에 성능이 더 좋다고 설명하면 면접관은 좋은 인상을 받습니다.

SELECT name,
       dept_id,
       salary,
       MAX(salary) OVER (PARTITION BY dept_id) AS dept_max_salary
FROM employees;

상관 서브쿼리와 윈도 함수의 선택 기준

두 방식은 같은 형태의 결과를 반환하지만 다음과 같은 차이가 있습니다.

  • 상관 서브쿼리: 이식성이 높고 매우 오래된 엔진에서도 작동하지만 행마다 다시 평가합니다.
  • 윈도 함수: 한 번만 순회하므로 큰 테이블에서 훨씬 빠르지만 SQL의 윈도 기능을 지원해야 합니다.

어느 쪽을 선택할지, 그리고 그 이유가 무엇인지 말해 보십시오. 작은 테이블에서 일회성으로 사용할 때는 어느 쪽이든 괜찮지만, 대규모 분석에서는 윈도 함수를 우선하십시오.

예제: 고객 평균보다 큰 주문

이 방식을 주문 데이터에 적용해 보십시오. 주문한 고객의 평균 주문 금액보다 큰 주문을 보여 주는 것입니다.

상관 AVG는 o2.customer_id = o1.customer_id로 범위가 제한되므로 각 주문에 해당 고객만의 기준값을 적용할 수 있습니다.

SELECT o1.order_id, o1.customer_id, o1.amount
FROM orders o1
WHERE o1.amount > (
    SELECT AVG(o2.amount)
    FROM orders o2
    WHERE o2.customer_id = o1.customer_id
);

NULL과 빈 그룹 사례에 주의하기

그룹에 행이 하나뿐이면 평균은 그 행의 값과 같습니다. 따라서 salary > avg는 거짓이 되어 해당 행이 제외됩니다. 이 경계 사례를 먼저 언급하십시오.

또한 NULL 급여는 AVG와 MAX에서 무시되며, 이는 SQL 집계의 의미와 일치합니다. 그룹의 모든 값이 NULL이면 집계값도 NULL이 되고 비교 결과는 UNKNOWN이 되어 행이 제외됩니다. 이런 경우까지 예상하는 것이 철저한 답변과 그렇지 않은 답변을 가르는 요소입니다.

그룹 내 순위 세기

상관 COUNT를 사용하면 그룹 안에서 한 행의 순위를 표현할 수 있습니다. 각 직원의 부서 내 급여 순위를 구하려면 자신보다 더 많이 받는 동료가 몇 명인지 세면 됩니다.

순위 1은 최고 수입자를 뜻합니다. 더 많이 받는 사람의 수에 1을 더하면 1부터 시작하는 순위가 되며, 상관 관계가 범위를 해당 부서로 제한합니다.

SELECT e1.name,
       e1.dept_id,
       e1.salary,
       (SELECT COUNT(*) + 1
        FROM employees e2
        WHERE e2.dept_id = e1.dept_id
          AND e2.salary > e1.salary) AS salary_rank_in_dept
FROM employees e1;

빠른 확인

이 작업에서 상관 서브쿼리가 일반적인 GROUP BY보다 나은 이유를 고르십시오.

요약: GROUP BY 없이 그룹별 집계값 구하기

핵심 정리:

  • 상관 서브쿼리는 세부 행을 합치지 않고 모든 세부 행에 그룹 수준의 집계값을 추가합니다.
  • 집계값을 표시하려면 SELECT에 사용하고, 각 행을 그룹과 비교하려면 WHERE에 사용하십시오.
  • = MAX(...) 방식은 공동 1위인 모든 행을 반환합니다.
  • PARTITION BY와 함께 사용하는 윈도 함수는 한 번의 순회로 같은 작업을 수행하며 일반적으로 더 잘 확장됩니다.

면접에서는 두 가지 해결책을 모두 제시하고 선택한 방법의 이유를 설명하십시오.

자주 묻는 질문

“GROUP BY 없이 그룹별 집계하기” 강의는 무료인가요?

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

“GROUP BY 없이 그룹별 집계하기”에서 뭘 배우나요?

상관 하위 쿼리를 사용해 상세 행과 함께 그룹 최댓값을 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“GROUP BY 없이 그룹별 집계하기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 상관 하위 쿼리의 구조
  2. GROUP BY 없이 그룹별 집계하기
  3. 상관 EXISTS와 NOT EXISTS
  4. 상관 하위 쿼리를 JOIN으로 다시 작성하기
← Coding Interview Prep(으)로 돌아가기