
(※개인 공부 목적의 게시물입니다.)
낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다.
FISH_INFO 테이블의 구조는 다음과 같으며 ID, FISH_TYPE, LENGTH, TIME은 각각 잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.
| Column name | Type Nullable | |
|---|---|---|
| ID | INTEGER | FALSE |
| FISH_TYPE | INTEGER | FALSE |
| LENGTH | FLOAT | TRUE |
| TIME | DATE | FALSE |
단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL 이며, LENGTH 에 NULL 만 있는 경우는 없습니다.
FISH_NAME_INFO 테이블은 물고기의 이름에 대한 정보를 담고 있습니다.
FISH_NAME_INFO 테이블의 구조는 다음과 같으며, FISH_TYPE, FISH_NAME 은 각각 물고기의 종류(숫자), 물고기의 이름(문자) 입니다.
| Column name | Type | Nullable |
|---|---|---|
| FISH_TYPE | INTEGER | FALSE |
| FISH_NAME | VARCHAR | FALSE |
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.
SELECT ID,
FISH_NAME,
LENGTH
FROM (SELECT *,
ROW_NUMBER() OVER(PARTITION BY FISH_TYPE
ORDER BY LENGTH DESC) AS RN
FROM FISH_INFO) I
JOIN FISH_NAME_INFO N
ON I.FISH_TYPE = N.FISH_TYPE
WHERE RN = 1
ORDER BY ID;
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY FISH_TYPE ORDER BY LENGTH DESC) AS RN FROM FISH_INFO) I
: 행과 행간의 관계를 쉽게 정의(비교, 연산)하기 위한 함수
: 행들을 그룹처럼 묶어서 계산하여, 그 집계결과를 각 행 옆에 붙여주는 함수
: 원래 행 수 그대로 유지
기본형식)
[함수] OVER(PARTITION BY col ORDER BY col)
- [함수] : MIN, MAX, SUM, COUNT, RANK 등과 같은 기존의 함수 또는 윈도우 함수용으로 추가된 함수(ROW_NUMBER() 등) / 필수
- OVER() : OVER 내부에 PARTITION BY절과 ORDER BY절이 들어감/ 필수
- PARTITION BY : '나누어 집계한다', 전체집합을 어떤 기준에 따라 나눌지 결정하는 부분/ 선택
- ORDER BY : 어떤 컬럼을 기준으로 순위를 정할 지 결정하는 부분 / 선택
-GROUP BY
1) 자르기+집약
2) GROUP BY절에서 지정된 컬럼으로 데이터를 그룹짓고 집계함수를 이용해 집약
3) 행 수 줄어듬(그룹당 1행만 남음)
4) 집계결과 외 상세정보를 담고있는 컬럼들을 가져오지 못함
5) 단순 집계결과를 보고싶을 때 사용
-윈도우 함수
1) 자르기
2) PARTITION BY절에서 지정된 컬럼으로 데이터를 그룹지음
3) 행 수 유지
4) 상세정보를 가지고있는 원본데이터 그대로 사용가능
WHERE RN = 1
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY FISH_TYPE ORDER BY LENGTH DESC) AS RN FROM FISH_INFO) I JOIN FISH_NAME_INFO N ON I.FISH_TYPE = N.FISH_TYPE