Growth ๐ŸŒณ/Practice ๐Ÿ’ป

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

์ธ” 2022. 8. 25. 15:50

 

๐Ÿ“ข ๋ณธ ํฌ์ŠคํŒ…์— ํ™œ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋ฌธ์ œ ๋ฐ ์ž๋ฃŒ ์ถœ์ฒ˜๋Š”

       ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต, https://school.programmers.co.kr/learn/challenges ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.

       ์œ„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต์— ๊ณต๊ฐœ๋œ ๋ฌธ์ œ๋Š” (์ฃผ)๊ทธ๋ ™์ด ์ €์ž‘๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


โ–  ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


โ–  ํ’€์ด

WITH RECURSIVE cte AS (
	SELECT 0 AS n
	UNION ALL
	SELECT n + 1 FROM cte WHERE n < 23
)

SELECT cte.n, SUM(CASE WHEN HOUR(OUTS.DATETIME)=cte.n THEN 1 ELSE 0 END) AS COUNT
 FROM cte cte
 LEFT JOIN ANIMAL_OUTS OUTS
 ON cte.n = HOUR(OUTS.DATETIME)
 GROUP BY 1;

 

๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ 

๋ณดํ˜ธ์†Œ์—์„œ๋Š” ๋ช‡ ์‹œ์— ์ž…์–‘์ด ๊ฐ€์žฅ ํ™œ๋ฐœํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

> DATETIME ์‹œ๊ฐ„๋งŒ ์ถ”์ถœํ•ด์„œ ์‹œ๊ฐ„๋Œ€๋กœ ๊ทธ๋ฃนํ•‘ ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

0์‹œ๋ถ€ํ„ฐ 23์‹œ๊นŒ์ง€, ๊ฐ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ์ž…์–‘์ด ๋ช‡ ๊ฑด์ด๋‚˜ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

> (๋ฌธ์ œ) HOUR(DATETIME)์€ ๋ฒ”์œ„๊ฐ€ 0-23์‹œ๊นŒ์ง€๊ฐ€ ์•„๋‹ˆ์—ฌ์„œ

                ์‹œ๊ฐ„๋Œ€์™€ ๋นˆ ์‹œ๊ฐ„๋Œ€์—๋Š” ์ž…์–‘๋œ ๋™๋ฌผ์ด ์—†์Œ ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ROW ์ƒ์„ฑ์ด ํ•„์š”ํ–ˆ๋‹ค.

   (ํ’€์ดํ•œ ๋ฐฉ๋ฒ•)

                > 0๋ถ€ํ„ฐ 23๊นŒ์ง€ ์—ฐ์†์ ์œผ๋กœ ์ •์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ํ…Œ์ด๋ธ” cte๋ฅผ ์žฌ๊ท€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค๊ณ     WITH์ ˆ   

                   ์ž…์–‘์‹œ๊ฐ„๋Œ€๋ฅผ cte์˜ ์‹œ๊ฐ„๋Œ€(0~23)์ปฌ๋Ÿผ๊ณผ ์กฐ์ธํ•ด์„œ ์ž…์–‘๋™๋ฌผ์ด ์žˆ๋Š” ์‹œ๊ฐ„๋Œ€๋Š” 1, ์—†๋Š” ์‹œ๊ฐ„๋Œ€๋Š” 0 

                   ์‹œ๊ฐ„๋Œ€(0~23)๋ณ„ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ์ž…์–‘๋™๋ฌผ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.
                   (CASE๋ฌธ์œผ๋กœ ์ž…์–‘๋™๋ฌผ์ด ์—†๋Š” ์‹œ๊ฐ„๋Œ€๋Š” 0์œผ๋กœ ์ง€์ •ํ–ˆ์œผ๋ฏ€๋กœ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ์ง‘๊ณ„ํ•œ ํ›„์—๋„ 0์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

  

์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์‹œ๊ฐ„๋Œ€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

> ORDER BY์ ˆ์— ์ ์šฉ


    WITH์ ˆ     WITH์ ˆ๋กœ  ์—ฐ์†ํ•˜๋Š” ์ˆซ์ž ์ถœ๋ ฅํ•˜๊ธฐ

WITH RECURSIVE test as
(
SELECT 0 AS num
UNION ALL
SELECT num+1
 FROM test
 WHERE num < ์ง€์ •์ˆซ์ž
)
SELECT num as N 
 FROM test;

0์„ num ์œผ๋กœ ์ง€์ •ํ•ด์„œ ์ถœ๋ ฅํ•˜๊ณ 

 num๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ 1์”ฉ ๋”ํ•ด์„œ

where์ ˆ์— ์ง€์ •์ˆซ์ž ๋ฒ”์œ„๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋Š” ํ…Œ์ด๋ธ”๊ณผ union all๋กœ ๋ฌถ์–ด with์ ˆ๋กœ test๋ฅผ ์ƒ์„ฑ.

 

test์—์„œ  num์„ ์ถœ๋ ฅํ•˜๋ฉด ๊ธฐ์กด์— ๋งŒ๋“ค์–ด์ง„ 0 ~ ์ง€์ •์ˆซ์ž๊นŒ์ง€ ์—ฐ์†์ ์ธ ์ˆซ์ž๊ฐ€ ํ–‰์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.