Software Engineering

[SQL 문제 풀이] 프로그래머스 '물고기 종류 별 대어 찾기'

머니기어 2024. 3. 21. 16:51
반응형

ROWNUMBER()를 활용한 전형적인 트릭

Programmers SQL 문제 풀이 Lv3물고기 종류별 대어 찾기

조건파악

FACT와 DIMENSION으로 분류된 전형적인 테이블 구조이다. 타겟 속성이 NULLABLE이다.

접근

그룹별로 최대값을 가진 행만 SELECT한다. 그룹 안에서 랭킹을 부여하면 된다. 이를 위해서는 ROWNUMBER()를 사용한다. 정렬 후 순서대로 ROWNUMBER를 부여하면 자연스럽게 랭킹을 구현할 수 있다. 특별히 이 경우, 그룹 내에서의 랭킹을 부여하기 위해 OVER()와 PARTITION을 사용한다. DESC로 정렬할 때 NULL을 뒤로 보내기 위해 IS NULL ASC의 정렬 조건을 추가한다.

쿼리분석

WITH J AS (
    SELECT 
        ID,
        FISH_NAME,
        LENGTH,
        ROW_NUMBER() OVER(PARTITION BY INFO.FISH_TYPE ORDER BY INFO.LENGTH IS NULL ASC, INFO.LENGTH DESC) AS ROWNUM
    FROM
        FISH_INFO AS INFO
    INNER JOIN
        FISH_NAME_INFO AS NAME ON INFO.FISH_TYPE = NAME.FISH_TYPE
)
SELECT
    ID,
    FISH_NAME,
    LENGTH
FROM
    J
WHERE 
    ROWNUM = 1
ORDER BY 
    ID ASC

FACT TABLE과 DIM TABLE을 조인한다. 

FISH_TYPE 칼럼의 값을 기준으로 하는 PARTITION 내에서 ROWNUM이라는 이름으로 행번호를 값으로 하는 새로운 칼럼을 만든다.

위 결과에서 필요한 칼럼에 대해서, ROWNUM=1인 행에 대해서 (LENGTH가 최대) SELECT한다.

ID에 대해서 정렬한다.

반응형