프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit
HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블에서 2022년도 한해 평가 점수가 가장 높은 사원 정보를 조회하려 합니다.
2022년도 평가 점수가 가장 높은 사원들의 점수, 사번, 성명, 직책, 이메일을 조회하는 SQL문을 작성해주세요.
2022년도의 평가 점수는 상,하반기 점수의 합을 의미하고, 평가 점수를 나타내는 컬럼의 이름은 SCORE로 해주세요.
-- 코드를 작성해주세요
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;
테이블이 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
(윈도우 함수)에 대해 정리하는 시간을 가져야겠다!