[리트코드 문제풀이] 184_윈도우 함수로 도전

김규리 (데이터분석가)·2022년 10월 2일
0

SQL 학습 시리즈

목록 보기
2/6

클릭>> 리트코드 184번 문제 링크

1차 시도

SELECT d1.name AS department
    ,e1.name AS employee
    ,e1.salary AS salary
    ,Max(e1.salary) OVER (PARTITION BY e1.departmentId) AS max_salary
FROM employee AS e1
INNER JOIN department AS d1 ON e1.departmentId = d1.id
WHERE salary = max_salary

여기까지 하고 막힌 이유는?

SELECT에서 연산한 결과물을 바로 WHERE 절에 쓸 수 없다!
...는 사실을 몰랐다.
위의 쿼리를 서브쿼리로 감싸주고 본쿼리에 WHERE 을 써줘야 함.

2차 시도

SELECT department
    , employee
    ,max_salary
FROM (SELECT d1.name AS department
            ,e1.name AS employee
            ,e1.salary AS salary
            ,Max(e1.salary) OVER (PARTITION BY e1.departmentId) AS max_salary
        FROM employee AS e1
        INNER JOIN department AS d1 ON e1.departmentId = d1.id
     ) 
WHERE salary = max_salary

여기서 또 막힘. 이유는?

서브쿼리에 AS로 이름설정 했어야 했는데, 그걸 몰랐다.

서브쿼리의 이름을 본쿼리의 SELECT와 WHERE 절에 써주는게 좋다.

예시)

SELECT 서브쿼리이름.컬럼이름
FROM ~~~~
WHERE 서브쿼리이름.컬럼이름 

3차 시도 : 성공!

SELECT ms.department
    , ms.employee
    ,ms.max_salary AS salary
FROM (SELECT d1.name AS department
            ,e1.name AS employee
            ,e1.salary AS salary
            ,Max(e1.salary) OVER (PARTITION BY e1.departmentId) AS max_salary
        FROM employee AS e1
        INNER JOIN department AS d1 ON e1.departmentId = d1.id
     ) AS ms
WHERE ms.salary = ms.max_salary

배운점 정리

  • SELECT에서 연산한 결과물을 바로 WHERE 절에 쓸 수 없음!
    서브쿼리로 감싸주고 WHERE 써줘야한다.
  • 서브쿼리에 이름이 있어야 WHERE 절에 쓸 수 있다.
profile
온라인 스토어 1인 창업가 출신 데이터 분석가

0개의 댓글