DISTINCT 와 LAST_VALUE 0 4 1,922

by 쪼이몬 [SQL Query] DISTINCT LAST_VALUE [2022.08.04 12:22:41]


안녕하세요 쿼리 질문드리려고 합니다!

회원A는 5장의 신용카드를 발급받아 소유하고 있으며, 이 5장의 카드중에 주이용카드는 무엇인지를 뽑아내려고 합니다.

 SELECT 
        DISTINCT 회원번호
      , LAST_VALUE(카드번호) OVER(PARTITION BY 회원번호 ORDER BY 이용금액 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLWING) AS 주이용카드번호
   FROM 회원별발급카드정보

이렇게 쿼리를 짰는데 회원 1명당 여러장의 카드를 가지고 있을 수 있다보니 DISTINCT를 걸어서 중복제거 했는데요..!

혹시 DISTINCT 없이 걸러낼 수 있는 방법 있을까요..?? 

by 마농 [2022.08.04 13:11:46]

회원 A 의 이용실적이 많은 카드가 공교롭게도 2장이 같은 금액이라면?
주이용카드는 두장 중에 어떤 카드가 되어야 맞을까요?
두장 다 주이용카드가 되어야 하는지?
아니면 하나의 카드만 골라야 하는지?
하나의 카드만 골라야 한다면 추가 선별 기준이 필요합니다.
카드번호가 작다거나, 크다거나, 카드이름이 빠르다거나, 발급일자가 빠르다거나 하는..

SELECT 회원번호
     , 카드번호 주이용카드번호
  FROM (SELECT 회원번호
             , 카드번호
             , RANK() OVER(PARTITION BY 회원번호 ORDER BY 이용금액 DESC) rk
             , ROW_NUMBER() OVER(PARTITION BY 회원번호 ORDER BY 이용금액 DESC, 발급일, 카드번호) rn
          FROM 회원별발급카드정보
        )
 WHERE rk = 1  -- 동순위 허용
-- WHERE rn = 1  -- 추가 기준 적용
;

 


by 김포도 [2022.08.04 13:54:42]

마농님 답변 감사합니다!

요청자가 이용금액이 같을 경우 정렬된 순으로 가장 마지막 카드를 보여줘도 무방하다 합니다☺️

 

아, 그리고  제가 여쭤보기전에 

rownumber로 변경을 해봤었는데

특정 회원번호 한사람으로 조건 걸고 비교해보니 

속도차이가 아주 조금 있더라구요

(DISTINCT 썼을 때가 살짝 더 빨랐습니다)

이게 매일 2000만건 이상의 데이터를 처리해야 하는데 DISTINCT가 속도를 많이 잡아먹는다고

해서 변경하려던 참인데...

특정 A회원만 조건 걸고 뽑았을 땐 DISTINCT가 빨랐더라도 대량 데이터 처리하게 되면

RANK 나 ROW_NUMBER 속도가 빠를까요?


by 마농 [2022.08.04 14:27:52]

일단. DISTINCT 는 억지스런 쿼리 느낌이 듭니다.
특정회원이 DISTINCT 가 빠르다??? 글쎄요?
특정회원 조건이면? 순식간(0.0몇초)에 결과가 나올텐데요?
속도차가 체감될지 의문이네요?
ROW_NUMBER 나, KEEP 이용해 보세요.

-- ROW_NUMBER --
SELECT 회원번호
     , 카드번호 주이용카드번호
  FROM (SELECT 회원번호
             , 카드번호
             , ROW_NUMBER() OVER(PARTITION BY 회원번호
               ORDER BY 이용금액 DESC, 발급일 DESC, 카드번호 DESC) rn
          FROM 회원별발급카드정보
        )
 WHERE rn = 1
;

-- KEEP --
SELECT 회원번호
     , MAX(카드번호) KEEP(DENSE_RANK FIRST
       ORDER BY 이용금액 DESC, 발급일 DESC) 주이용카드번호
  FROM 회원별발급카드정보
;

 


by 김포도 [2022.08.04 16:17:44]

넵! 감사합니다 

답변 참고해서 수정해보겠습니다??

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