๐Ÿฌ MySQL/Programmers ํ’€์ด

[Programmers] ์ž…์–‘ ์‹œ๊ฐ ๊ตฌํ•˜๊ธฐ(2) (Lv.4)

Chloe._. 2022. 9. 2. 22:20

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๋ฅผ ์—ฐ๊ฒฐํ•ด์คฌ๋‹ค

 

 

ํ˜ผ์ž์„  ๋ชป ํ’€์—ˆ์„ ๋ฌธ์ œ๋‹ค... ์•„๋ฌดํŠผ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋„ ์ด์ œ ์™„๊ฒฐ!