자율 학습/학습

[SQL] 3달 전 게시글 중에서 조회수 1순위부터 3순위까지 조회하기 (ADD_MONTHS)

60cod 2022. 10. 10. 17:29

ADD_MONTHS(기준 날짜, 숫자) : 기준 날짜의 월에서 숫자만큼 더하거나 뺀다

 

✔️주의할 점은 날짜의 이전달이나 다음달에 기준날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 리턴된다.

예를 들어 "2019-03-31"의 이전달은 "2019-02-28"이 된다.

출처: https://gent.tistory.com/260

 

 

나는 매달 조회수 랭크를 매겨서 그 달의 1,2,3등을 뽑는 쿼리를 짜야 했다.

그래서 아래와 같이 쿼리를 짰고 ADD_MONTH의 -3 자리는 컨트롤러에서 숫자만 바꿔서 실행시켜서 달마다 뽑게 했다.

-- MONTH는 몇 월인지 표시용
-- 댓글과 좋아요는 없을 수 있어서 아우터 조인과 NVL 사용
-- ADD_MONTH의 -3 자리는 숫자만 바꿔가며 사용
-- 랭크 1~3등 뽑기
SELECT R.RECIPE_NO, R.RECIPE_TITLE, R.MEM_NAME, R.IMG, 
        R.CMT_CNT, R.LIKE_CNT, R.HIT, TO_CHAR(R.REG_DATE, 'MM')AS MONTH
FROM (SELECT M.MEM_NAME, R.RECIPE_TITLE, R.RECIPE_NO,
            NVL(RC.CNT, 0) AS CMT_CNT, R.REG_DATE,
            NVL(RL.CNT, 0) AS LIKE_CNT, RI.IMG, R.HIT,
            ROW_NUMBER() OVER(ORDER BY R.HIT DESC) AS HIT_RANK
    FROM RECIPE R INNER JOIN MEMBER M
                        ON M.MEM_NO = R.MEM_NO
                  INNER JOIN RECIPE_IMG RI
                        ON R.RECIPE_NO = RI.RECIPE_NO
                        AND RI.IMG_TYPE = 0
                        AND RI.DEL = 1
                  LEFT OUTER JOIN (SELECT COUNT(*) AS CNT, RECIPE_NO, DEL
                            FROM RECIPE_LIKE
                            WHERE DEL = 1
                            GROUP BY RECIPE_NO, DEL)RL
                        ON R.RECIPE_NO = RL.RECIPE_NO
                  LEFT OUTER JOIN (SELECT COUNT(*) AS CNT, RECIPE_NO, DEL
                            FROM RECIPE_CMT
                            WHERE DEL = 1
                            GROUP BY RECIPE_NO, DEL)RC
                        ON R.RECIPE_NO = RC.RECIPE_NO
    WHERE R.DEL = 1
    AND TO_CHAR(R.REG_DATE, 'YY/MM') 
    = TO_CHAR(ADD_MONTHS(TO_DATE(SYSDATE, 'YY/MM/DD'), -3), 'YY/MM'))R
WHERE R.HIT_RANK BETWEEN 1 AND 3
;