[D+22][SQL] ์ด๋ ํ๊ท ์ ํ์ฉํ ๋ ์ง๋ณ ๋งค์ถ ํ๊ท ๊ตฌํ๊ธฐ - AVG() OVER (), ROWS UNBOUNDED PRECEDING
โ๏ธ STUDY INDEX
01. ์ด๋ ํ๊ท ๊ฐ๋
02. ์ด๋ ํ๊ท ๊ด๋ จ ํจ์ ๋ฐ ๊ตฌ๋ฌธ
01. ์ด๋ ํ๊ท ๊ฐ๋
์ด๋ ํ๊ท (Moving Average)์ ์๊ณ์ด ๋ฐ์ดํฐ์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๊ณ ๋ฐ์ดํฐ์ ํจํด์ ์ดํดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํต๊ณ์ ๊ธฐ๋ฒ์ด๋ค. ์ผ์ ํ ๊ธฐ๊ฐ ๋์์ ๋ฐ์ดํฐ์ ํ๊ท ์ ๊ณ์ฐํ์ฌ ๊ฐ ์์ ์์์ ๊ฐ์ ๊ตฌํฉ๋๋ค.
์ด๋ ํ๊ท ์ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
1. ๋ฐ์ดํฐ ์ค๋ฌด๋ฉ: ์๊ณ์ด ๋ฐ์ดํฐ์ ๋ณ๋์ฑ์ ์ค์ฌ์ ํจํด์ ๋ ๋ช ํํ๊ฒ ๋ณด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
2. ์ถ์ธ ๋ถ์: ๋ฐ์ดํฐ์ ์ฅ๊ธฐ์ ์ธ ์ถ์ธ๋ฅผ ํ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
3. ์ฃผ์ ๋ฐ ๊ธ์ต ์์ฅ ๋ถ์: ์ฃผ์ ๊ฐ๊ฒฉ์ ์์ง์์ ๋ถ์ํ์ฌ ๋งค์ ๋ฐ ๋งค๋ ์์ ๊ฒฐ์ ์ ๋์์ ์ค๋๋ค.
ChatGPT ์ด๋ํ๊ท '์ ๋ํ ๋ต๋ณ ์ผ๋ถ ๋ฐ์ท (2024-05-29)
์์ฝํ์๋ฉด, ์ด๋ ํ๊ท (Moving Average)์ ๋ฐ์ดํฐ์ ์ถ์ธ์ ํจํด์ ํ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ด์์!
์ค๋ฌด์์๋ ๋จ์ํ ๋ ์ง๋ณ ๋งค์ถ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ๋ฉด ๋งค์ถ ๋ณ๋์ ํ์ ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, 7์ผ ํ๊ท ๋งค์ถ์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ ํ๊ท ์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. ์ค๋์ Mysql๋ก ์ด๋ ํ๊ท ์ ํ์ฉํ ๋ ์ง๋ณ ๋งค์ถ ํ๊ท ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค!
02. ์ด๋ ํ๊ท ๊ด๋ จ ํจ์ ๋ฐ ๊ตฌ๋ฌธ - ์๋์ฐ ํจ์, ROWS
SQL์์ ์ด๋ํ๊ท ์ ๊ตฌํ๊ธฐ ์ํด์ ์๋์ฐ ํจ์์ ROWS UNBOUNDED PRECEDING์ ์ฌ์ฉํฉ๋๋ค.
ํ๊ท ์ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋์ฐ ํจ์๋ AVG() OVER (ORDER BY ์นผ๋ ROWS ...)๋ก ์์ฑํฉ๋๋ค.
ROWS UNBOUNDED PRECEDING์ ์ฃผ๋ก ์๋์ฐ ํจ์์ ํจ๊ป ํ์ฉํ๊ณ ํน์ ๋ฒ์์ ํ์ ์ง์ ํ ๋ ์ฌ์ฉํด์. ์ ๋ ์ด๋ฒ์ ์ฒ์ ์๊ฒ ๋๋๋ฐ ๋์ ๊ณ์ฐํ ๋ ์์ฃผ ์ฌ์ฉํ๋ค๊ณ ํ๋ ์ตํ๋์ธ์!
๊ธฐ๋ณธ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ํ์ฉ๋ฒ์ ์๋์ ๊ฐ์์.
๊ธฐ๋ณธ ๋ฌธ๋ฒ | ์๋ฏธ |
ROWS BETWEEN lower_bound AND upper_bound | lower_bound ๋ถํฐ upper_bound๊น์ง ํ ํฌํจ |
UNBOUNDED PRECEDING | ํ์ฌ ํ ์ด์ ๋ชจ๋ ํ ํฌํจ |
n PRECEDING | ํ์ฌ ํ ์ด์ n๊ฐ ํ ํฌํจ |
CURRENT ROW | ํ์ฌ ํ ํฌํจ |
n FOLLOWING | ํ์ฌ ํ ์ดํ n๊ฐ ํ ํฌํจ |
UNBOUNDED FOLLOWING | ํ์ฌ ํ ์ดํ ๋ชจ๋ ํ ํฌํจ |
# 7์ผ ์ด๋ ํ๊ท ๊ตฌํ๊ธฐ(1)
SELECT date,
SUM(sales) AS total_sales,
AVG(SUM(sales)) OVER (ORDER BY date ROWS BETWEEN PRECEDING 6 AND CURRENT ROW) AS moving_avg
# ๋ ์ง ๊ธฐ์ค ์ ๋ ฌ, 6์ผ์ ๋ถํฐ ํ์ฌ๊น์ง์ ํ ์ฌ์ฉ
FROM ํ
์ด๋ธ ๋ช
GROUP BY date
ORDER BY date;
# 7์ผ ์ด๋ ํ๊ท ๊ตฌํ๊ธฐ(2) - 7์ผ์ด ์๋ ๋ฐ์ดํฐ๋ null๋ก ๋ฐํํ์ฌ ์ ์ธํด์ฃผ๊ธฐ
SELECT date,
SUM(sales) as total_sales,
AVG(SUM(sales) OVER (ORDER BY date ROWS BETWEEN PRECEDING 6 AND CURRENT ROW) AS moving_avg,
CASE WHEN 7 = COUNT(*)
THEN AVG(SUM(sales)) OVER (ORDER BY date ROWS BETWEEN PRECEDING 6 AND CURRENT ROW)
ELSE NULL END AS moving_avg_strinct
FROM ํ
์ด๋ธ๋ช
GROUP BY date
ORDER BY date;
ChatGPT์๊ฒ 1๋ฒ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ฌ๋ผ๊ณ ํ๋๋ฐ, ์ง๊ณํ๋ค๋ฉด ์ฐ์ธก์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฑฐ์์. 1~6์ผ๊น์ง๋ ํ๊ท ์ ์์ฐจ์ ์ผ๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ 01-07 ์ดํ๋ถํฐ๊ฐ ์ ํํ 7์ผ๊ฐ์ ์ด๋ ํ๊ท ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค์! ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฐ๋ค๋ฉด ๋งค์ถ ์ถ์ธ๋ ์ฆ๊ฐ๋ฅ ์ ๋ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์์๋ฏํฉ๋๋ค.
[ 2024. 5. 29 Today I Learned ] ์ค๋์ SQL์ ํ์ฉํด์ ์ด๋ํ๊ท ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ณต์ตํ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ์ดํดํ์ง๋ง, ๊ฐ๋จํ ์์ ๊ฐ ์๋ ํ์ฑํ ์ ์ ๋น์จ, ์ฆ๊ฐ๋ฅ ๋ฑ์ ๊ณ์ฐํ๋ค๋ฉด ํจ์ฌ ์ด๋ ต๊ณ ๋ณต์กํ ๊ฒ ๊ฐ์์. ๋ง์ ๋ณต์ต์ด ํ์ํ ๋ฏ ํฉ๋๋ค. ๊ทธ๋๋ SQL ์ฑ๋ฆฐ์ง ์ธ์ ์ ๋ค์ผ๋ฉด์ ์ฟผ๋ฆฌ๋ฅผ ์์ฉํด์ ์ํ๋ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฒ์ ๋ฐฐ์ธ ์ ์์ด ๋๋ฌด ์ข์ต๋๋ค!๐
*์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ [KDT ๋ฐ์ดํฐ ๋ถ์๊ฐ ์์ฑ ๊ณผ์ ] ์ค SQL ์ฑ๋ฆฐ์ง ์ธ์ 2ํ ์ฐจ ์๋ฐ์ ๋ณต์ต ํฌ์คํ ์ ๋๋ค.