자율 학습/학습
[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
;