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
'프로그래머스 SQL kit' 카테고리의 다른 글
[JOIN] 없어진 기록 찾기 /JOIN대신 NOT EXSITS 사용하기 (0) | 2024.11.01 |
---|---|
[SUM,MAX,MIN] 연도별 대장균 크기의 편차 구하기/JOIN절/YEAR() (1) | 2024.10.29 |
[SUM,MAX,MIN] 중복 제거하기 / DISTINCT사용법 (1) | 2024.10.29 |
[SUM,MAX,MIN] 가격이 제일 비싼 식품의 정보 출력하기 /서브쿼리 (1) | 2024.10.29 |
[SELECT] 강원도에 위치한 생산공장 목록 출력하기 / LIKE구문 (0) | 2024.10.29 |