MySQL ์๋์ฐ ํจ์ ์ฝ๊ฒ ์ดํดํ๊ธฐ! 
์ด ์์์ MySQL์์ **์๋์ฐ ํจ์(Window Function)**๋ฅผ ์ด๋ป๊ฒ ์ฐ๋์ง, ์ข
๋ฅ๋ณ ํน์ง๊ณผ ๋ฌธ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ค์ต ์์ ๋ฅผ ํตํด ์์ธํ ์ค๋ช
ํด ์ค๋๋ค. ์๋์ฐ ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ง ์๊ณ ๋ ๊ฐ ํ๋ณ๋ก ์์, ์ด์ /๋ค์ ํ ๋น๊ต, ๋์ ํฉ๊ณ ๋ฑ์ ์ฝ๊ฒ ๊ณ์ฐํ ์ ์๊ฒ ํด์ฃผ๋ ์์ฃผ ์ ์ฉํ ๊ธฐ๋ฅ์ด์์.
๋ชฉ์ฐจ
โข
โข
โข
โข
โข
โข
โข
โข
โข
โข
์๋์ฐ ํจ์ ๊ฐ๋
๊ณผ ๊ธฐ๋ณธ ๋ฌธ๋ฒ [00:00:14]
์๋์ฐ ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ง ์๊ณ ๋ ๊ฐ ํ์ ๋ํด ์์(๋ญํฌ), ํ ๋ฒํธ, ์ด์ ํ๊ณผ ๋ค์ ํ ๋น๊ต ๊ฐ์ ์์
์ ํ ์ ์๋ ํจ์์
๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ํจ์๋ช
๋ค์ย OVERย ํค์๋๋ฅผ ์ฐ๊ณ , ๊ทธ ์์ย PARTITION BYย (๊ทธ๋ฃน ๊ธฐ์ค),ย ORDER BYย (์ ๋ ฌ ๊ธฐ์ค), ๊ทธ๋ฆฌ๊ณ ย ROWS BETWEENย (๋ฒ์ ์ง์ ) ์ต์
์ ๋ฃ์ด ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด,
ROW_NUMBER() OVER (PARTITION BY ๋ถ์ ORDER BY ๊ธ์ฌ DESC)
SQL
๋ณต์ฌ
๋ ๋ถ์๋ณ๋ก ๊ธ์ฌ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ํ ๊ฐ ํ์ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ๋ถ์
๋๋ค.
์ฃผ์ ์๋์ฐ ํจ์ ์ข
๋ฅ์ ํน์ง [00:01:27]
1.
ROW_NUMBER(): ๊ฐ ๊ทธ๋ฃน(ํํฐ์
) ๋ด์์ ํ ๋ฒํธ๋ฅผ ๋งค๊น๋๋ค.
2.
RANK(): ์์๋ฅผ ๋งค๊ธฐ๋๋ฐ, ๋์ ์ด ์์ผ๋ฉด ๋ค์ ์์๋ฅผ ๊ฑด๋๋๋๋ค.
โข
์: 1๋ฑ, 2๋ฑ, 2๋ฑ, 2๋ฑ ๋ค์์ 5๋ฑ
3.
DENSE_RANK(): ๋์ ์ด ์์ด๋ ์์๋ฅผ ๊ฑด๋๋ฐ์ง ์์ต๋๋ค.
โข
์: 1๋ฑ, 2๋ฑ, 2๋ฑ, 2๋ฑ ๋ค์์ 3๋ฑ
4.
NTILE(n): ๋ฐ์ดํฐ๋ฅผ n๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ ๊ฐ ๊ทธ๋ฃน์ ๋ฒํธ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
โข
์: 30๋ช
์ 4๊ทธ๋ฃน์ผ๋ก ๋๋๋ฉด ๊ฐ ๊ทธ๋ฃน์ 1~4 ๋ฒํธ ๋ถ์ฌ
5.
LAG(column, n, default): ํ์ฌ ํ ๊ธฐ์ค์ผ๋ก ์ด์ nํ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. ๊ฐ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ(default) ์ฌ์ฉ
6.
LEAD(column, n, default): ํ์ฌ ํ ๊ธฐ์ค์ผ๋ก ๋ค์ nํ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
7.
FIRST_VALUE() / LAST_VALUE(): ๊ทธ๋ฃน ๋ด ์ฒซ ๋ฒ์งธ / ๋ง์ง๋ง ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
ํ๋ ์ ์ง์ ์ต์
์ดํดํ๊ธฐ (๋ฒ์ ์ค์ ) [00:04:28]
์๋์ฐ ํจ์๋ย ROWS BETWEENย ์ต์
์ผ๋ก ์ง๊ณ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ด์.
โข
UNBOUNDED PRECEDING: ๊ฐ์ฅ ์ฒซ ํ๋ถํฐ
โข
CURRENT ROW: ํ์ฌ ํ๊น์ง
โข
N PRECEDING: ํ์ฌ ํ์์ Nํ ์ด์ ๊น์ง
โข
N FOLLOWING: ํ์ฌ ํ์์ Nํ ์ดํ๊น์ง
โข
UNBOUNDED FOLLOWING: ๊ฐ์ฅ ๋ง์ง๋ง ํ๊น์ง
์๋ฅผ ๋ค์ด,
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
SQL
๋ณต์ฌ
๋ ์ฒซ ํ๋ถํฐ ํ์ฌ ํ๊น์ง ๋ฒ์๋ฅผ ์ง์ ํ๋ ๊ฑฐ์์. ์ด ๋ฒ์ ๋ด์์ ํฉ๊ณ๋ ํ๊ท ์ ๊ตฌํ ์ ์๋ต๋๋ค.
์ค์ต: ๋ก์ฐ ๋๋ฒ (ROW_NUMBER) ํจ์ ์ฌ์ฉ๋ฒ [00:11:04]
โข
๋ถ์๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน(ํํฐ์
)ํ๊ณ ๊ธ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค, ๊ฐ ํ์ ์๋ฒ์ ๋ถ์
๋๋ค.
โข
๊ฒฐ๊ณผ: ๋ถ์๋ณ๋ก ๊ธ์ฌ๊ฐ ๋์ ์์๋๋ก 1, 2, 3... ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ์.
SELECT ROW_NUMBER() OVER (PARTITION BY ๋ถ์ ORDER BY ๊ธ์ฌ DESC) AS ์๋ฒ, ์ด๋ฆ, ๊ธ์ฌ FROM ํ
์ด๋ธ;
SQL
๋ณต์ฌ
๋ญํฌ(RANK)์ ๋์ค ๋ญํฌ(DENSE_RANK) ์ฐจ์ด [00:16:18]
โข
RANK(): ๋์ ์ด ์์ผ๋ฉด ๋ค์ ์์๋ฅผ ๊ฑด๋๋๋๋ค.์) 1, 2, 2, 2, 5
โข
DENSE_RANK(): ๋์ ์ด ์์ด๋ ์์๋ฅผ ๊ฑด๋๋ฐ์ง ์๊ณ ์ฐ์์ผ๋ก ๋งค๊น๋๋ค.์) 1, 2, 2, 2, 3
๋์ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ค๋ฅด๋, ์ํ๋ ๊ฒฐ๊ณผ์ ๋ง๊ฒ ์ ํํ์ธ์!
์ํ์ผ(NTILE) ํจ์๋ก ๋ฐ์ดํฐ ๊ทธ๋ฃน ๋๋๊ธฐ [00:18:52]
โข
๋ฐ์ดํฐ๋ฅผ N๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ ๊ฐ ๊ทธ๋ฃน์ ๋ฒํธ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
โข
์: 30๋ช
์ 4๊ทธ๋ฃน์ผ๋ก ๋๋๋ฉด 1~4๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ๋๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋น์ทํ ํฌ๊ธฐ๋ก ๋๋ฉ๋๋ค.
SELECT NTILE(4) OVER (ORDER BY ๊ธ์ฌ DESC) AS ๊ทธ๋ฃน๋ฒํธ, ์ด๋ฆ, ๊ธ์ฌ FROM ํ
์ด๋ธ;
SQL
๋ณต์ฌ
์ด์ ํ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ: ๋ ๊ทธ(LAG), ๋ค์ ํ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ: ๋ฆฌ๋(LEAD) [00:21:18]
โข
LAG(): ํ์ฌ ํ ๊ธฐ์ค์ผ๋ก ์ด์ ํ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โข
LEAD(): ํ์ฌ ํ ๊ธฐ์ค์ผ๋ก ๋ค์ ํ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โข
๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์์ด์, ์ด์ /๋ค์ ํ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด ์ถ๋ ฅ๋ผ์.
์)
LAG(๊ธ์ฌ, 1, 0) OVER (ORDER BY ์ฌ์๋ฒํธ)
SQL
๋ณต์ฌ
๋ ์ด์ ํ ๊ธ์ฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฉด 0์ ๋ฐํํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฐ๊ณผ ๋ง์ง๋ง ๊ฐ ๊ฐ์ ธ์ค๊ธฐ: ํผ์คํธ ๋ฐธ๋ฅ(FIRST_VALUE), ๋ผ์คํธ ๋ฐธ๋ฅ(LAST_VALUE) [00:23:20]
โข
FIRST_VALUE(): ๊ทธ๋ฃน ๋ด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โข
LAST_VALUE(): ๊ทธ๋ฃน ๋ด ๋ง์ง๋ง ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
โข
๊ทธ๋ฃน ๊ธฐ์ค๊ณผ ์ ๋ ฌ ๊ธฐ์ค์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
์) ๋ถ์๋ณ ์ฒซ ๋ฒ์งธ ๊ธ์ฌ
FIRST_VALUE(๊ธ์ฌ) OVER (PARTITION BY ๋ถ์ ORDER BY ์ฌ์๋ฒํธ)
SQL
๋ณต์ฌ
์๋์ฐ ํจ์๋ก ๋์ ํฉ๊ณ, ํ๊ท ๋ฑ ์ง๊ณ ํจ์ ํ์ฉํ๊ธฐ [00:34:09]
โข
์๋์ฐ ํจ์ ์์์ย SUM(),ย AVG(),ย MIN(),ย MAX(),ย COUNT()ย ๊ฐ์ ์ง๊ณ ํจ์๋ฅผ ์ธ ์ ์์ด์.
โข
ํ๋ ์ ๋ฒ์๋ฅผ ์ง์ ํด ๋์ ํฉ๊ณ๋ ํ๊ท ์ ๊ตฌํ ์ ์์ต๋๋ค.
์) ํ์ฌ ํ๊น์ง ๊ธ์ฌ ๋์ ํฉ๊ณ
SUM(๊ธ์ฌ) OVER (ORDER BY ์ฌ์๋ฒํธ ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
SQL
๋ณต์ฌ
๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ ๋ฐ ์์ฝ [00:39:41]
โข
์๋์ฐ ํจ์๋ ๊ทธ๋ฃนํ ์์ด๋ ๊ฐ ํ๋ณ๋ก ์์, ๋์ ํฉ, ์ด์ /๋ค์ ํ ๋น๊ต ๋ฑ ๋ค์ํ ๋ถ์์ด ๊ฐ๋ฅํด์.
โข
ํต์ฌ์ย OVER()ย ์์ย PARTITION BYย (๊ทธ๋ฃน ๊ธฐ์ค),ย ORDER BYย (์ ๋ ฌ ๊ธฐ์ค),ย ROWS BETWEENย (๋ฒ์ ์ง์ )์ ์ ์ ํ ์ฐ๋ ๊ฒ!
โข
์ค์ต์ ํตํด ์ง์ ์จ๋ณด๋ฉด ํจ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
์๋์ฐ ํจ์๋ ๋ฐ์ดํฐ ๋ถ์๊ณผ ๋ณด๊ณ ์ ์์ฑ์ ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ์ด ์์์ผ๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ์ตํ๋ฉด MySQL ํ์ฉ ๋ฅ๋ ฅ์ด ํ์ธต ์
๊ทธ๋ ์ด๋ ๋ ๊ฑฐ์์! 
๊ฐ์ฌํฉ๋๋ค! ์์๊ณผ ํจ๊ป ์ง์ ์ณ๋ณด๋ฉด์ ์ตํ๋ณด์ธ์!
#MySQL #์๋์ฐํจ์ #๋ฐ์ดํฐ๋ถ์ #SQL์ค์ต