프로그래머스 SQL kit

[SUM,MAX,MIN] 물고기 종류 별 대어 찾기/WHERE-IN절/DENSE_RANK

정호나 2024. 10. 29. 12:00

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/293261

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

 

 

 

오류
-- 코드를 작성해주세요
SELECT A.ID, B.FISH_NAME, A.LENGTH
FROM FISH_INFO A
JOIN FISH_NAME_INFO B ON
A.FISH_TYPE = B.FISH_TYPE
WHERE LENGTH > 10
AND (SELECT MAX(LENGTH) 
    FROM FISH_INFO
    WHERE A.FISH_TYPE = B.FISH_TYPE
    GROUP BY B.FISH_NAME
    )
ORDER BY A.ID

 

서브쿼리와 GROUP BY로 FISH_NAME을 묶어서 풀었는데 아이디때문에 너무 코드가 지저분하다.

출력결과도 오류

 

 

첫번째 정답

 

 

-- 코드를 작성해주세요
SELECT A.ID, B.FISH_NAME, A.LENGTH
FROM FISH_INFO A
JOIN FISH_NAME_INFO B ON
A.FISH_TYPE = B.FISH_TYPE
WHERE (A.FISH_TYPE,LENGTH)
LENGTH > 10 AND
IN (
    SELECT FISH_TYPE, MAX(LENGTH)
    FROM FISH_INFO
    GROUP BY FISH_TYPE
    )
ORDER BY A.ID

 

 

WHERE절에 A.FISH_TYPE으로 명시해야 오류생기지 않음.

IN절에도 A.FISH_TYPE을 명시해야되는 줄 알았는데 WHERE절만 명시해도 성공했다.

 

두번째 정답

 

 

DENSE_RANK 사용

 

# DENSE_RANK 함수 사용
WITH MAX_RANK AS (
    SELECT ID, FISH_TYPE, LENGTH, 
    DENSE_RANK() OVER(
         PARTITION BY FISH_TYPE 
         ORDER BY LENGTH DESC) AS RANK_L
    FROM FISH_INFO
)

SELECT ID, FISH_NAME, LENGTH
FROM MAX_RANK
LEFT JOIN FISH_NAME_INFO USING(FISH_TYPE)
WHERE RANK_L=1
ORDER BY ID;

 

1. WITH MAX_RANK

MAX_RANK 임시테이블 생성 : 각 어종별 물고기 길이에 대한 순위 매김PARTITION BY는 GROUP BY와 같다

 

2. JOIN절

 

  • 메인 SELECT 문에서는 MAX_RANK 테이블과 FISH_NAME_INFO 테이블을 FISH_TYPE을 기준으로 조인합니다.
  • RANK_L=1 조건을 사용하여 어종별 길이 순위가 1위인 물고기만 선택합니다. 즉, 각 어종에서 가장 큰 길이를 가진 물고기만 결과에 포함됩니다.

 

 

 

 

 

참고

 

https://donghodazzi.tistory.com/334

 

[MySQL] DENSE_RANK() 함수

순위함수(분석함수) 결과에 순번, 순위를 매기는 함수 비집계함수 중 RANK, NTILE, DENSE_RANK, ROW_NUMBER 등이 해당된다. SELECT (arguments) OVER ([PARTITION BY ] ORDER BY ) FROM 테이블명; PARTITION BY : 동일 그룹으로

donghodazzi.tistory.com