반응형
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에 대해서 정렬한다.
반응형
'Software Engineering' 카테고리의 다른 글
[Python 문제 풀이] 프로그래머스 '[PCCP 기출문제] 2번 / 석유 시추' (0) | 2024.03.17 |
---|---|
[Python 문제 풀이] 프로그래머스 '[PCCP 기출문제] 4번 / 수레 움직이기' (0) | 2024.03.17 |
Airflow에서 TaskFlow API(@task)와 PythonOperator가 아닌 Operator 같이 사용하기 (0) | 2024.02.02 |
How to use TaskFlow API (@task) while using an Operator other than Python (0) | 2024.02.02 |
PolarDB에서 OSS에 있는 csv파일 로드하기 (FOREIGN TABLE) (0) | 2024.02.02 |