[Programmers] ์ ์ ์๊ฐ ๊ตฌํ๊ธฐ(2) (Lv.4)
https://chloe-chitchat.tistory.com/42?category=1108732
[Programmers] ์ ์ ์๊ฐ ๊ตฌํ๊ธฐ(1) (Lv.2)
SELECT HOUR(DATETIME) AS HOUR , COUNT(ANIMAL_ID) FROM ANIMAL_OUTS GROUP BY HOUR HAVING HOUR BETWEEN 9 AND 19 ORDER BY HOUR HAVING์ ์ HOUR(DATETIME)์ด๋ผ๊ณ ๋ถ๋ฌ์ฃผ๋ฉด ๋ชป์์๋ฃ๊ณ HOUR๋ผ๊ณ ๋ณ์นญ์ ์จ์ค์ผ..
chloe-chitchat.tistory.com
์ ๋ฌธ์ ์ ์ฌํ ๋ฒ์ ์ด๋ค.
์ผ์ชฝ: Lv.2์์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
์ค๋ฅธ์ชฝ: Lv.4์์ ์ด๋ ๊ฒ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ทธ๋ฃน๊น์ง ๋ง๋ค์ด์ผ ํ๋ค.
Lv.4๋ฌธ์ ์ Lv.2์ฟผ๋ฆฌ๋ฅผ ์ ์ฉํด๋ณด๋ฉด 7์-18์๊น์ง ๋์จ๋ค.
๋ฌธ์ ์์ 0์-23์๊น์ง ์ถ๋ ฅํ๋ผ ํ๋ค.
์ฆ ๋ฌธ์ ์ ์๋ DATETIME ์ปฌ๋ผ์ GROUP BYํ ๊ฒ ์๋๋ผ HOUR ์ปฌ๋ผ์ ์ธ์์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
- ๋ฐฉ๋ฒ1: SET์ผ๋ก ์๋ก์ด ๋ณ์ ์ ์ธ
- ๋ฐฉ๋ฒ2: WITH RECURSIVE ์ฌ๊ท ์ฟผ๋ฆฌ๋ก ์๋ก์ด ํ ์ด๋ธ ์์ฑ
๋ฐฉ๋ฒ1: SET์ผ๋ก ์๋ก์ด ๋ณ์ ์ ์ธ
SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR,
(SELECT COUNT(ANIMAL_ID)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)=@HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
SET + @ ๋ ์๋ก์ด ๋ณ์๋ฅผ ์ ์ธํ๋ ํจ์๋ค. DML์ ๊ฐ๋จํ ๋ฐฐ์ฐ๋ฉด์ ๋ค์ด๋ณธ ์ ์ ์์๋๋ฐ ์ด๋ ๊ฒ ์จ๋ดค๋ค...
SET์์ := ๋ ๋์ ์ฐ์ฐ์๋ค. ๊ทธ๋ฅ =๋ก ์จ๋ SET์ ์์ ์์์ ๋น๊ต์ฐ์ฐ์๊ฐ ์๋ ๋์ ์ฐ์ฐ์๋ก ์ดํดํ๋๊ฑฐ ๊ฐ๊ธด ํ๋ฐ ๊ทธ๋๋ ํ์คํ ๊ฑด :=์ธ๊ฐ๋ณด๋ค.
์ฆ ์ฟผ๋ฆฌ๋ฅผ ๋ฏ์ด๋ณด๋ฉด,
SET์ : -1๋ก ์ ํ
SELECT์ : 0๋ถํฐ ์์
HOUR์ด: SET์ผ๋ก ๋ง๋ ์๋ก์ด ๋ณ์, ํ ์ด๋ธ์์ ๋์จ ๊ฒ ์๋
COUNT์ด: Lv.2์์ ๋ง๋ ์ฟผ๋ฆฌ, ํ ์ด๋ธ์์ ๋์จ HOUR = SET์ผ๋ก ๋ง๋ HOUR๋ก ์กฐ๊ฑด ์ค์ ์ฐ๊ฒฐํด์ฃผ๊ธฐ
WHERE์ : HOUR ๋ฐ๋ณต ๋์ด์ฃผ๊ธฐ... ์ด๋ 24 ๋ฏธ๋ง์ด ์๋๋ผ 23 ๋ฏธ๋ง์ผ๋ก ํด์ผํจ
๋ฐฉ๋ฒ2: WITH RECURSIVE ์ฌ๊ท ์ฟผ๋ฆฌ๋ก ์๋ก์ด ํ ์ด๋ธ ์์ฑ
WITH RECURSIVE ์ด๋ผ๋ ์ฌ๊ท ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ๋ ์๋ค
์ฐ์ CTE(Common Table Expression)๋ผ๋ ๊ฒ ์๋ค... ๋ฉ๋ชจ๋ฆฌ ์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํด ํ ์ด๋ธ์ฒ๋ผ ์ธ ์ ์๋ค. ์ง์ง ํ ์ด๋ธ ์์ฑ๊ณผ๋ ๋ค๋ฅธ๋ฐ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์งํฉ์ ๊ฐ์์ ํ ์ด๋ธ์ฒ๋ผ ์ด๋ฆ๋ ๋ถ์ฌ์ฃผ๊ณ ๋ค๋ฅธ ์ฟผ๋ฆฌ ์ธ๋ ๋ถ๋ฅผ ์๋ ์๋ค. CTE์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ WITH๋ฌธ๊ณผ WITH RECURSIVE๋ฌธ ๋๊ฐ์ง๊ฐ ์๋ค. ์ฌ๊ท์ฌ๋ถ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค.
WITH๋ฌธ์ ์๊ณ ์์๊ณ ์ฌ์ฉํ ์ค ์๋ RECURSIVE๋ง ๋ค๋ค๋ณด๊ฒ ๋ค.
-- ํ์
WITH RECURSIVE ํ
์ด๋ธ๋ช
AS (
SELECT -- ๋น๋ฐ๋ณต๋ฌธ, ์ด๊ธฐ๊ฐ ์ค์ ์ํด
UNION ALL -- ์ฒซํ๊ณผ ์์ผ๋ก์ ๋ฐ๋ณต์ ์๊ธฐ ์ํด
SELECT -- ๋ฐ๋ณต๋ฌธ, ๋ฐ๋ณต ์ค์ ์ํด
WHERE -- ์ ์ง์กฐ๊ฑด
)
-- ์์
WITH RECURSIVE num_table AS (
SELECT 0 AS num
UNION ALL
SELECT num + 1 FROM num_table
WEHRE num < 10
)
0~10๊น์ง์ ๊ฐ์ ๊ฐ๋ ํ ์ด๋ธ์ ๋ง๋๋ ์์๋ค.
์ฒซ SELECT๋ฌธ์์ 0์ ๋ง๋ค๊ณ , ๋๋ฒ์งธ SELECT๋ฌธ์์ ์ด๋ป๊ฒ ๋ฐ๋ณตํ ์ง ๋งํ๊ณ , WHERE์์ ์ ์ง์กฐ๊ฑด์ ์คฌ๋ค.
๊ผญ UNION ALL๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค๊ฑฐ๋ ์ฟผ๋ฆฌ ์์ ์๊ธฐ์์ ํ ์ด๋ธ๋ช ์ ์ฐธ์กฐํ๋ค๋ ํน์ง์ด ์๋ค.
-- ๋ต์
WITH RECURSIVE rc AS (
SELECT 0 AS hour
UNION ALL
SELECT hour + 1
FROM rc
WHERE hour < 23 )
SELECT rc.hour, COUNT(HOUR(ao.datetime)
FROM rc LEFT JOIN animal_outs ao ON rc.hour = HOUR(ao.datetime)
GROUP BY rc.hour
์ฌ๊ทํจ์ ์ดํด๋ง ๋๋ค๋ฉด ๋ ์ด๊ฒ ๋ ๊ฐ๋จํด๋ณด์ธ๋ค
์์ WITH RECURSIVE๋ฌธ์ผ๋ก 0๋ถํฐ 23๊น์ง์ rc.hour๋ฅผ ๋ง๋ค์ด์คฌ๊ณ
๋ฐ์ ์ฟผ๋ฆฌ์์ ๋ง๋ hour์ ์ ์ํ ์ด๋ธ์ datetime ์ hour๋ฅผ ์ฐ๊ฒฐํด์คฌ๋ค
ํผ์์ ๋ชป ํ์์ ๋ฌธ์ ๋ค... ์๋ฌดํผ ํ๋ก๊ทธ๋๋จธ์ค๋ ์ด์ ์๊ฒฐ!