๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/299310
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ถํ๋ ์ฐ๋(YEAR), ๋ถํ๋ ์ฐ๋๋ณ ๋์ฅ๊ท ํฌ๊ธฐ์ ํธ์ฐจ(YEAR_DEV), ๋์ฅ๊ท ๊ฐ์ฒด์ ID(ID) ๋ฅผ ์ถ๋ ฅํ๋ SQL ๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๋ถํ๋ ์ฐ๋๋ณ ๋์ฅ๊ท ํฌ๊ธฐ์ ํธ์ฐจ๋ ๋ถํ๋ ์ฐ๋๋ณ ๊ฐ์ฅ ํฐ ๋์ฅ๊ท ์ ํฌ๊ธฐ - ๊ฐ ๋์ฅ๊ท ์ ํฌ๊ธฐ๋ก ๊ตฌํ๋ฉฐ ๊ฒฐ๊ณผ๋ ์ฐ๋์ ๋ํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ๊ฐ์ ์ฐ๋์ ๋ํด์๋ ๋์ฅ๊ท ํฌ๊ธฐ์ ํธ์ฐจ์ ๋ํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ฃผ์ธ์.
ํ์ด์ ์์ ...
Window ํจ์
: ์๋์ฐ ํจ์๋ ํ๊ณผ ํ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ์ ์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํจ์์ด๋ค.
๊ธฐ์กด SQL์ ์ง๊ณํจ์๊ฐ ์ปฌ(์ด)๋ผ ๊ฐ ์ฐ์ฐ์๋ ์ฌ์ฉํ๊ธฐ ์ข์ผ๋ ๋ ์ฝ๋(ํ) ๊ฐ์ ์ฐ์ฐ์ ์ฒ๋ฆฌํ์ง ๋ชปํจ์ ๋ฐ๋ผ ์๋์ฐ ํจ์๊ฐ ๋ง๋ค์ด์ก๋ค.
์๋์ ๊ฐ์ด ํฌ๊ฒ 5๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ๊ทธ๋ฃน ๋ด ์์ : RANK, DENSE_RANK, ROW_NUMBER
- ๊ทธ๋ฃน ๋ด ์ง๊ณ : SUM, MAX, MIN, AVG, COUNT
- ๊ทธ๋ฃน ๋ด ํ ์์ : FIRST_VALUE, LAST_VALUE, (LEAD :์ค๋ผํด)
- ๊ทธ๋ฃน ๋ด ๋น์จ : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT
- ํต๊ณ ๋ถ์ : REGR_SLOPE, REGR_INTERCEPT ...
์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ OVER ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉฐ, ์ด ์์ ๋ค์ํ ์ต์ ์ ๊ณต์ด ๊ฐ๋ฅํ๋ค.
→ PARTITION BY, ORDER BY, ROWS BETWEEN ~ AND ~ , CURRENT ROW .. ๋ฑ๋ฑ
์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
SELECT WINDOW_FUNCTION (ARGUMENTS)
OVER ([PARTION BY ์กฐ๊ฑด] [ORDER BY] [ROWS BETWEEN a AND b ])
FROM TABLE
๋ฌธ์ ํ์ด 1 - ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉ
1. ์ฐ๋๋ณ ๊ฐ์ฅ ํฐ ๋์ฅ๊ท ์ ํฌ๊ธฐ
select YEAR(differentiation_date) as year, max(size_of_colony) as size
from ecoli_data
group by YEAR(differentiation_date)
year() ๋ฅผ ํตํด ์ฐ๋๋ก casting ํด ์ค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ(group by)ํ ํ ๊ฐ์ฅ ํฐ ๋์ฅ๊ท ์ ์ฐพ๋๋ค.
2. ํธ์ฐจ ๊ตฌํ๊ธฐ
1์ ์๋ธ์ฟผ๋ฆฌ๋ก ํ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ๋ค์ ๋ฝ์์จ๋ค.
์ฝ๋
select YEAR(differentiation_date) as year, abs(size_of_colony - size) as year_dev, id
from ecoli_data ecoli join
(select YEAR(differentiation_date) as year, max(size_of_colony) as size
from ecoli_data
group by YEAR(differentiation_date)
) dev
on YEAR(ecoli.differentiation_date) = dev.year
order by year, year_dev
์๋ธ์ฟผ๋ฆฌ ๋ง๊ณ ๋ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
์์์์ ์๋์ฐ ํจ์๋ฅผ ํ์ฉํด๋ณด์!
๋ฌธ์ ํ์ด 2 - Window ํจ์ ์ฌ์ฉ
์๋ธ์ฟผ๋ฆฌ๋ก ๋ฃ์๋ ๋ถ๋ถ์ window ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ค.
์ฝ๋
select year(differentiation_date) as year,
max(size_of_colony) over (partition by year(differentiation_date)) - size_of_colony as year_dev, id
from ecoli_data
order by year, year_dev
ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค~