๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SQL

[MySQL] ์‹œ๊ฐ„๋Œ€๋ณ„ ๋ฐฉ๋ฌธ ํ†ต๊ณ„ ๊ตฌํ•˜๊ธฐ

by Jo__y 2022. 10. 19.

๋ฐฉ๋ฒ• 1

SELECT Hour(access_date) AS hh , count(access_date) AS cnt
FROM access_log
WHERE access_date BETWEEN '2022-01-01 00:00:00' AND date_format(now(),'%Y-%m-%d 23:59:59')
GROUP BY hh
ORDER BY hh ASC;
  • access_date ์—์„œ Hour() ๋กœ ์‹œ๊ฐ„๊ฐ’(0,1,2,3...) ๋งŒ ๊ฐ€์ ธ์˜จ ๋’ค
  • ๊ทธ ๊ฐ’์„ GROUP BY ๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ์ œ๊ฑฐ์™€ ํ•จ๊ป˜ count ๊ฐ’์„ ๊ตฌํ•œ๋‹ค
  • BETWEEN AND ์ ˆ๋กœ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค

์ถœ๋ ฅ

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ๊ฐ’์ด ์žˆ๋Š” ์‹œ๊ฐ„๋งŒ ์ถœ๋ ฅ์„ ํ•œ๋‹ค.

๊ฐ’์˜ ์œ ๋ฌด์™€ ์ƒ๊ด€์—†์ด 1~24 ์‹œ๊ฐ„๋Œ€๋ณ„ ๋ฐฉ๋ฌธ ํ†ต๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฐฉ๋ฒ• 2

์šฐ์„  ํ–‰๋ฒˆํ˜ธ๋‚˜ ์‹œ๊ฐ„ ๋“ฑ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๋‹ค.

SELECT @N := @N +1 AS n
FROM access_log , (select @N:=0 from DUAL ) NN
LIMIT 24;
  • SELECT @๋ณ€์ˆ˜์ด๋ฆ„ := ๋Œ€์ž…๊ฐ’;
  • ๋ณ€์ˆ˜ N ์„ ์–ธ ๋ฐ 0 ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ํ›„
  • 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•˜์—ฌ ์ตœ๋Œ€ 24๊นŒ์ง€ ์ถœ๋ ฅํ•œ๋‹ค

์ถœ๋ ฅ

-1 ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋ฉด 0๋ถ€ํ„ฐ 23๊นŒ์ง€ ์ถœ๋ ฅ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. Hour ๋กœ ์‹œ๊ฐ„์„ ๊ตฌํ• ๊ฒฝ์šฐ 24์‹œ๋Š” 0 ์‹œ๋กœ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— -1 ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•œ๋‹ค.

์ด์ œ ์ด ํ…Œ์ด๋ธ”์„ ๋ฐฉ๋ฌธ ํ†ต๊ณ„ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜๋ฉด ๋œ๋‹ค.

SELECT A.n AS h , ifnull(B.cnt,0) AS cnt
 FROM
 (SELECT @N := @N +1 AS n
    FROM access_log, (select @N:=-1 from DUAL ) NN
    LIMIT 24) AS A
LEFT JOIN 
    (SELECT HOUR(access_date) AS hh, COUNT(access_date) AS cnt 
    FROM access_log 
    WHERE access_date BETWEEN '2022-01-01 00:00:00' AND date_format(now(),'%Y-%m-%d 23:59:59')
    GROUP BY hh) AS B
    ON A.n = B.hh ;
  • ๊ฐ’์ด ์—†๋Š” ์ปฌ๋Ÿผ์€ ifnull ์„ํ†ตํ•ด 0 ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค

์ด์ œ 0~23 ์‹œ๊ฐ„ ๋ณ„๋กœ ์ ‘์† ํ†ต๊ณ„ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฐธ์กฐ

[MYSQL] ์ฟผ๋ฆฌ๋ฌธ์„ ์ด์šฉํ•œ ๋งค์‹œ๊ฐ„๋Œ€๋ณ„ ๋ฐฉ๋ฌธ ํ†ต๊ณ„ ๊ตฌํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€