최대 1 분 소요

문제 링크

정답

SELECT employee_id, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(*) = 1

UNION

SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = 'Y'

✅ Point

  • primary department 의 조건
      1. 한 직원(employee_id)이 여러 부서(department_id)에 속해있는 경우: primary_flag 가 Y인 부서가 primary department
      1. 한 직원(employee_id)이 한 부서(department_id)에만 속해있는 경우: primary_flag의 값과 상관 없이 해당 부서가 primary department
  • 조건 1, 2를 만족하는 결과를 각각 SELECT로 구현한 뒤, UNION으로 합쳐 최종 결과 도출

다른 풀이

  • Subquery & PARTITION BY
    SELECT
      employee_id,
      department_id
    FROM 
      (
          SELECT
              *,
              COUNT(employee_id) OVER(PARTITION BY employee_id) AS EmployeeCount
          FROM Employee
      ) EmployeePartition
    WHERE
      EmployeeCount = 1
      OR primary_flag = 'Y';
    
  • 조건 1, 2를 만족하는지 검증하기 위해 필요한 정보:
    • employee_id 별 department_id의 개수:
    • primary_flag 값
      • 이때, employee_id 로 GROUP BY를 한다면, 기존 row 별 primary_flag 값에 접근할 수 없음
      • 따라서 PARTITION BY를 통해 기존 primary_flag 을 유지하면서, 그룹화 수행
    • COUNT(employee_id) OVER(PARTITION BY employee_id)
  • WHERE & SUBQUERY
    SELECT
      employee_id,
      department_id
    FROM 
      Employee
    WHERE
      primary_flag = 'Y'
      OR employee_id IN (
          SELECT employee_id
          FROM Employee
          GROUP BY employee_id
          HAVING COUNT(employee_id) = 1
      );