프로그래머스 SQL 고득점 Kit - 조건에 맞는 사원 정보 조회하기

Jinyoung Cheon·2025년 8월 17일
0

코딩테스트

목록 보기
24/25

프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

GROUP BY

problem

HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블에서 2022년도 한해 평가 점수가 가장 높은 사원 정보를 조회하려 합니다.
2022년도 평가 점수가 가장 높은 사원들의 점수, 사번, 성명, 직책, 이메일을 조회하는 SQL문을 작성해주세요.
2022년도의 평가 점수는 상,하반기 점수의 합을 의미하고, 평가 점수를 나타내는 컬럼의 이름은 SCORE로 해주세요.

code

-- 코드를 작성해주세요
SELECT G.SCORE, E.EMP_NO, E.EMP_NAME, E.POSITION, E.EMAIL

FROM HR_EMPLOYEES AS E

JOIN (SELECT EMP_NO, SUM(SCORE) AS SCORE
      
      FROM HR_GRADE
      
      GROUP BY EMP_NO) AS G
      
ON E.EMP_NO = G.EMP_NO

ORDER BY SCORE DESC

LIMIT 1;        

note

테이블이 3개가 나와서 당황했지만 쉽게 풀 수 있는 문제였다.
어떻게 하면 더욱 효율적이고, 문제에서 요구한 바를 정확하게 표현할 수 있을까? 고민했다. 총 3가지를 보완할 수 있었다.

2022년 필터 빠짐 → WHERE YEAR = 2022

동점 처리 → LIMIT 1은 동점을 잘라버림. “가장 높은 사원들”이면 동점 모두 반환

불필요한 작업 최소화 → 집계 끝난 뒤에만 사원 테이블과 조인
WITH yearly AS (
  SELECT
    EMP_NO,
    SUM(SCORE) AS SCORE
  FROM HR_GRADE
  WHERE `YEAR` = 2022
  GROUP BY EMP_NO
)

SELECT
  y.SCORE,
  e.EMP_NO,
  e.EMP_NAME,
  e.`POSITION`,
  e.EMAIL

FROM (
  SELECT
    EMP_NO,
    SCORE,
    DENSE_RANK() OVER (ORDER BY SCORE DESC) AS rnk
  FROM yearly
) y

JOIN HR_EMPLOYEES e ON e.EMP_NO = y.EMP_NO

WHERE y.rnk = 1;

추가로 조만간 WINDOW FUNCTION (윈도우 함수)에 대해 정리하는 시간을 가져야겠다!

profile
데이터를 향해, 한 걸음씩 천천히.

0개의 댓글