๋ณธ ๋ฌธ์ ๋ ํ๊ตญ๋ฐ์ดํฐ์ฐ์ ์งํฅ์ DATA ON-AIR์์ '๊ธฐ์ ์๋ฃ'๋ก ์ ๊ณตํ๋ SQL ํด์ฆ์ ๋๋ค.
์ฐ์๋ ๋ ์ง๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ํํํด๋ณด์
๋ฌธ์
๋ฒํธ์ ๋ ์ง๋ฅผ ๊ฐ์ง ํ ์ด๋ธ(<ํ 1> ์ฐธ์กฐ)์์ ๋ฒํธ๋ณ๋ก ์ฐ์๋ ๋ ์ง๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ <ํ 2>์ ๊ฐ์ด ๋ฒํธ, ์์์ผ, ์ข ๋ฃ์ผ, ์ผ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ธ์.
<ํ 1> ์๋ณธ ํ
์ด๋ธ
ํ์ด
<์ฐธ๊ณ ์ฌํญ>
ํ์ด ํ ๋ ํ ์ด๋ธ์ ์๋์ ๊ฐ์ด ๋ง๋ค์๋ค.
๋ํ ํ ์ด๋ธ ์์ฑ์์ visit_dt๊ฐ timestamp ํํ๋ก ๋ง๋ค์ด์ ธ ์ฟผ๋ฆฌ์์ DATE ๋ณํ์ ํด์คฌ๋ค.
· ํ ์ด๋ธ๋ช : user_log
· ์ปฌ๋ผ๋ช : NO → id, DT → visit_dt
๋ฌธ์ ์์ ์ค์ํ ์ ์ id๋ณ๋ก ์ฐ์๋๋ visit_dt๋ฅผ ๋๋๋ ๊ฒ์ด์๋ค.
โ ์ฌ์ฉ์ ๋ณ์*๋ฅผ ์ ์ธํด์ id, visit_dt ์์ผ๋ก ์๋ฒ์ ๋ถ์ฌํด์ฃผ์๋ค.
โก visit_dt ์์ ROWNUM(๊ฒฝ๊ณผ์ผ์)์ ๋นผ์ค์ ์ฐ์๋์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ผ์(GRP)๊ฐ ๋์ค๋๋ก ํ๋ค.
SELECT ul.id, DATE(ul.visit_dt) visit_dt,
@ROWNUM := @ROWNUM +1 AS ROWNUM,
DATE_ADD(DATE(ul.visit_dt), INTERVAL -(@ROWNUM) DAY) AS GRP
FROM data_on_air.user_log ul, (SELECT @ROWNUM := 0) NUM
์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ณธ ํ ์ด๋ธ๋ก ํ์ฌ id, GRP๋ณ๋ก ๊ทธ๋ฃนํํด์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ๋ฉด id๋ณ → ์ผ์๊ตฌ๊ฐ๋ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
SELECT T1.id, MIN(T1.visit_dt) AS from_dt
, MAX(T1.visit_dt) AS to_dt
, COUNT(*) AS CNT
FROM (
SELECT ul.id, DATE(ul.visit_dt) visit_dt,
@ROWNUM := @ROWNUM +1 AS ROWNUM,
DATE_ADD(DATE(ul.visit_dt), INTERVAL -(@ROWNUM) DAY) AS GRP
FROM data_on_air.user_log ul, (SELECT @ROWNUM := 0) NUM
) T1
GROUP BY T1.id, T1.GRP;
โ ์ฐธ๊ณ