mysql group by date, 데이터가 없는 date의 처리 0 2 600

by 토마톰 [2021.01.20 14:57:47]


예를들어 특정 미디어의 좋아요 수치를 일별로 집계한 테이블이 있다고 가정했을때 아래와같은 데이터가 존재합니다

date             count(누적)         count(일일증감)
2021-01-01   100                    0
2021-01-02   150                    50
2021-01-04   250                    100
2021-01-07   400                    150
2021-01-08   480                    80
....

위 데이터를 해석해보자면 1일날은 이전일자 대비 0개가 증감되어 현재 누적수치가 100개이고, 다음날 2일에는 전일대비 50개가 증가하여 150개, 그리고 그 다음날 같읕방식으로 데이터가 존재합니다.

이러한 테이블의 데이터가3일, 5,6일 데이터가 누락되어 row가 존재하지 않습니다. 
이런상황에 1일부터 8일까지의 데이터를 조회하며, 누락된 3,5,6일의 경우 누적수치를 이전일자의 누적수치, 그리고 증감수치를 0으로 두려고 합니다.
이때 비어있는 날짜 (inull의 조건때)에 이전 누적수치로 대체하여 데이터를 만들려고하는데 이걸 변수를 사용하지 않고 간단하게 처리 할 수있는 방법이 있다면 그 방법에 대한 키워드나 참고할 수 있는 정보를 공유 받고싶습니다

뽑고자 하는 원하는 데이터의 결과는 아래와 같습니다
date             count(누적)         count(일일증감)
2021-01-01   100                    0
2021-01-02   150                    50
2021-01-03   150                    0
2021-01-04   250                    100
2021-01-05   250                    0
2021-01-06   250                    0
2021-01-07   400                    150
2021-01-08   480                    80

 

감사합니다.

by 마농 [2021.01.20 15:28:56]
WITH RECURSIVE calendar AS
(
SELECT '2021-01-01' dt    -- 시작일
 UNION ALL
SELECT DATE_ADD(dt, INTERVAL 1 DAY)
  FROM calendar
 WHERE dt < '2021-01-08'  -- 종료일
)
, data_t AS
(
SELECT '2020-12-31' dt, 100 cnt_1, 10 cnt_2
-- UNION ALL SELECT '2021-01-01', 100,   0
UNION ALL SELECT '2021-01-02', 150,  50
UNION ALL SELECT '2021-01-04', 250, 100
UNION ALL SELECT '2021-01-07', 400, 150
UNION ALL SELECT '2021-01-08', 480,  80
)
SELECT a.dt
     , COALESCE(b.cnt_1, (SELECT cnt_1 FROM data_t WHERE dt < a.dt ORDER BY dt DESC LIMIT 1), 0) cnt_1
     , IFNULL(b.cnt_2, 0) cnt_2
  FROM calendar a
  LEFT OUTER JOIN data_t b
    ON a.dt = b.dt
;

 


by 토마톰 [2021.01.20 16:43:38]

마농님 감사합니다! 쿼리로 상세하게 답변주실줄은 생각도 못했는데 큰 도움이 된것같습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입