Oracle

분석함수 RANK OVER() /ROW_NUMBER() OVER()

몰빼미 2022. 9. 7. 20:16

영화 리뷰 사이트 프로젝트에 찜하기 기능을 넣었다.

영화 찜하기 기능

하트를 클릭하면 자동으로 시퀀스값이 증가되면서

찜table에 영화값이 insert되는 기능이다.

 

또한 추천영화 카테고리를 만들어서

유저가 찜을 하면 추천영화에 노출이되는 기능을 만들려고했다.

 

하지만

 

 

두 사용자가 동시에 찜을 하면 추천 영화에 영화가 중복되어 출력된다.

영화값의 중복을 피하고자

DISTINCT, GROUP BY 절을 넣어

시도해봤으나 모두 실패하였다....

 

 

이런저런 시도중 분석함수라는 걸 알아냈다.

 

▼아래는 분석함수 ROW_NUMBER() OVER() 을 사용한 쿼리

 

1
2
3
4
5
6
7
8
SELECT  * 
FROM(SELECT ROW_NUMBER() OVER(PARTITION BY 영화제목 
           ORDER BY 등록번호 DESC ) AS RNUM, 
           찜테이블.* 
           FROM 찜테이블 ) 
WHERE RNUM = 1 
ORDER BY 등록번호 DESC 
 
cs

 

좌(서브쿼리 실행결과) 우(전체쿼리 실행결과)

 

이제 다수의 사용자가 동시에 같은 영화를 찜해도

아래와 같이 중복을 피해서 상위값만 나오도록 되었다.

 

원하던 결과 !