โ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/301649
๋ฌธ์ ์ค๋ช
๋์ฅ๊ท ๋ค์ ์ผ์ ์ฃผ๊ธฐ๋ก ๋ถํํ๋ฉฐ, ๋ถํ๋ฅผ ์์ํ ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ๊ฐ์ฒด, ๋ถํ๊ฐ ๋์ด ๋์จ ๊ฐ์ฒด๋ฅผ ์์ ๊ฐ์ฒด๋ผ๊ณ ํฉ๋๋ค.
๋ค์์ ์คํ์ค์์ ๋ฐฐ์ํ ๋์ฅ๊ท ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ ECOLI_DATA
ํ
์ด๋ธ์
๋๋ค. ECOLI_DATA
ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ, ID
, PARENT_ID
, SIZE_OF_COLONY
, DIFFERENTIATION_DATE
, GENOTYPE
์ ๊ฐ๊ฐ ๋์ฅ๊ท ๊ฐ์ฒด์ ID, ๋ถ๋ชจ ๊ฐ์ฒด์ ID, ๊ฐ์ฒด์ ํฌ๊ธฐ, ๋ถํ๋์ด ๋์จ ๋ ์ง, ๊ฐ์ฒด์ ํ์ง์ ๋ํ๋
๋๋ค.
Column name | Type | Nullable |
ID | INTEGER | FALSE |
PARENT_ID | INTEGER | TRUE |
SIZE_OF_COLONY | INTEGER | FALSE |
DIFFERENTIATION_DATE | DATE | FALSE |
GENOTYPE | INTEGER | FALSE |
์ต์ด์ ๋์ฅ๊ท ๊ฐ์ฒด์ PARENT_ID
๋ NULL ๊ฐ์
๋๋ค.
๋ฌธ์
๋์ฅ๊ท ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ด๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๋ ์์ 0% ~ 25% ๋ฅผ 'CRITICAL', 26% ~ 50% ๋ฅผ 'HIGH', 51% ~ 75% ๋ฅผ 'MEDIUM', 76% ~ 100% ๋ฅผ 'LOW' ๋ผ๊ณ ๋ถ๋ฅํฉ๋๋ค. ๋์ฅ๊ท ๊ฐ์ฒด์ ID(ID
) ์ ๋ถ๋ฅ๋ ์ด๋ฆ(COLONY_NAME
)์ ์ถ๋ ฅํ๋ SQL ๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ฒด์ ID ์ ๋ํด ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์ . ๋จ, ์ด ๋ฐ์ดํฐ์ ์๋ 4์ ๋ฐฐ์์ด๋ฉฐ ๊ฐ์ ์ฌ์ด์ฆ์ ๋์ฅ๊ท ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์์
์๋ฅผ ๋ค์ด ECOLI_DATA
ํ
์ด๋ธ์ด ๋ค์๊ณผ ๊ฐ๋ค๋ฉด
ID | PARENT_ID | SIZE_OF_COLONY | DIFFERENTIATION_DATE | GENOTYPE |
1 | NULL | 10 | 2019/01/01 | 5 |
2 | NULL | 2 | 2019/01/01 | 3 |
3 | 1 | 100 | 2020/01/01 | 4 |
4 | 2 | 16 | 2020/01/01 | 4 |
5 | 2 | 17 | 2020/01/01 | 6 |
6 | 4 | 101 | 2021/01/01 | 22 |
7 | 6 | 101 | 2022/01/01 | 23 |
8 | 6 | 1 | 2022/01/01 | 27 |
๊ธฐ์ค์ ์ํด ๋ถ๋ฅ๋ ๋์ฅ๊ท ๋ค์ ID๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CRITICAL (์์ 0% ~ 25%) : ID 6, ID 7
HIGH (์์ 26% ~ 50%) : ID 3, ID 5
MEDIUM (์์ 51% ~ 75%) : ID 1, ID 4
LOW (์์ 76% ~ 100%) : ID 2, ID 8
๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ฅผ ID ์ ๋ํด ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
ID | COLONY_NAME |
1 | MEDIUM |
2 | LOW |
3 | HIGH |
4 | MEDIUM |
5 | HIGH |
6 | CRITICAL |
7 | CRITICAL |
8 | LOW |
โ๐ปํ์ด
percent_rank()๋ฅผ ์ด์ฉํ์ฌ ์๋ ์์๋ฅผ ๊ตฌํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์ฅ๊ท ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๋์ ์์ ํผ์ผํธ๋ฅผ ๊ตฌํ๋ค.
id์ percent_rank๋ง ์๋ ํ
์ด๋ธ์ ๊ตฌํ๋ค.
๊ตฌํ ํ
์ด๋ธ๋ก๋ถํฐ ๊ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ป์ฝ๋
select id, case
when size_rank <= 0.25 then 'CRITICAL'
when size_rank <= 0.50 then 'HIGH'
when size_rank <= 0.75 then 'MEDIUM'
else 'LOW'
end as colony_name
from (select id, percent_rank() over (order by size_of_colony desc) as size_rank
from ecoli_data) ed
order by id
๐ก์๋ก ๋ฐฐ์ด ๋ด์ฉ
์๋ ์์๋ฅผ ๊ณ์ฐํ๋ ํจ์ - percent_rank
- percent_rankํจ์์ ๊ธฐ๋ณธ ํ์
percent_rank() over ([partition by ์ด] order by ์ด) - percent_rank๋ ์ง์ ํ ๊ทธ๋ฃน ๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ฃน ๋ด์ ์๋ ์์๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
- percent_rankํจ์๋ cume_dist ํจ์์ ์ ์ฌํ์ง๋ง ๋์ ๋ถํฌ๊ฐ ์๋ ๋ถํฌ ์์์ด๋ค.
๋์ ๋ถํฌ๋ฅผ ๊ณ์ฐํ๋ ํจ์ - cume_dist
- cume_distํจ์์ ๊ธฐ๋ณธ ํ์
cume_dist() over ([partition by ์ด] order by ์ด) - cume_distํจ์๋ 0์ด๊ณผ 1์ดํ ๋ฒ์ ๊ฐ์ ๋ฐํ, ๊ฐ์ ๊ฐ์ ํญ์ ๊ฐ์ ๋์ ๋ถํฌ๊ฐ์ผ๋ก ๊ณ์ฐ.
- cume_dist๋ ๊ธฐ๋ณธ์ ์ผ๋ก null๊ฐ์ ํฌํจํ๋ฉฐ null๊ฐ์ ํด๋น ๋ฐ์ดํฐ ์งํฉ์์ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ผ๋ก ์ทจ๊ธ.
๐ํ๊ธฐ
์์ ํผ์ผํธ๋ฅผ ๋ณด์๋ง์ percent_rank๊ฐ ๋ ์ฌ๋์ง๋ง ์ด๋ป๊ฒ ์ฐ๋์ง๋ ๋ชฐ๋๋ค.
์ง๊ธ๊น์ง ์ง๋ฌดํ
์คํธ ๋ณด๋ฉด์ ์ด ์ ๋์ ํจ์๋ ์ด ์ ์ด ์์ด์ ๋์ค์ ํ์ํ ๋ ์ฐพ์๋ณด๋ฉด ๋์ง ํ๋๋ฐ ํน์ ๋ชจ๋ฅด๋ ์ด๋ฐ ํจ์๋ ๋ง์ด ์์๋ฌ์ผ๊ฒ ๋ค.