[PostgreSQL] 상품 추천 N개 조회 중 마지막 1개를 다른 조건 넣는 방법이 있을까요? 0 3 589

by 미사스키 [SQL Query] [2018.04.17 10:23:31]


안녕하세요

하수의 머리로 고민도 해보고 구글질을 열심히 해봐도 방법을 못 찾아 이렇게 문의를 드립니다. ㅠㅠ;;

사용자에게 상품을 추천하는 방식인데 여러 조건에서 상품별로 ranking 점수별로 소팅해서 N개 제한하고 쿼리입니다.

요구 사항은 N개 중에 가장 낮은 순위 (마지막)에 자회사 제품을 1개를 넣어주고 싶습니다.

ranking 별로 상품을 추천하기 때문에 ranking이 낮은 자사제품이 N개 조회 조건에 들어갈 확률이 거의 없습니다.

N-1개는 기존대로 랭킹대로 조회하고 제조사 = 자회사 조건으로 1개만 조회해서 조회 결과 마지막에 추가하는 방식이 있는지 문의 드립니다. 

 

select x.상품코드, x.상품명, x.상품설명, x.상품카테고리, x.ranking,  .....

from

( select a.상품코드, a.상품명, case when lang = 'ko' ...

...

from 상품 a, 판매 b, 환율 c, 타게팅 t,  ...

left join (select .... from 재고 where .. ) t1,

left join (select .... from 마켓 where .. ) t2,

.....

where .....

) x

ORDER BY x.ranking DESC LIMIT N

 

이런 식에서 마지막에 나머지 조건은 모두 같고 제조사 = 자회사 조건이 하나 더 추가되어 1개만 조회 해서 전체 N개 조회가 가능할까요? (__)

 

by 마농 [2018.04.17 10:43:31]
SELECT *
  FROM (SELECT 상품코드, 상품명, 상품설명, 상품카테고리
             , ...
             , ROW_NUMBER() OVER(ORDER BY 점수 DESC, 상품코드) 랭킹
          FROM ...
         WHERE ...
           AND 상품코드 != :자사상품코드
        ) a
 WHERE 랭킹 < :N
 UNION ALL
SELECT 상품코드, 상품명, 상품설명, 상품카테고리
     , ...
     , :N 랭킹
  FROM ...
 WHERE ...
   AND 상품코드 = :자사상품코드
;

 


by 미사스키 [2018.04.17 11:03:58]

와우~ 빠른 답변 감사합니다. 

 

기존 쿼리가 복잡하고 비용이 커서 union 을 쓰면 증가된 비용 때문에 DB 부담이 걱정이 되서요... ㅠㅠ 

union을 한번 더 검토해보고 상품 추천 배치를 만들어서 자사상품을 추가하는 방법과 비교해 봐야 할 것 같습니다. 

 


by 마농 [2018.04.17 11:27:52]

물론 OR 조건을 이용한다면 Union 안해도 됩니다...
하지만 이게 더 비용이 높을 가능성도 있습니다.
OR 절 사용해 보시고 UNION 방식과 성능 비교해 보세요.
 

SELECT *
  FROM (SELECT 상품코드, 상품명, 상품설명, 상품카테고리
             , ...
             , ROW_NUMBER() OVER(ORDER BY 점수 DESC, 상품코드) 랭킹
          FROM ...
         WHERE ...
        ) a
 WHERE 랭킹 < :N
    OR 상품코드 = :자사상품코드
;

 

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