안녕하세요 쿼리 질문드리려고 합니다!
회원A는 5장의 신용카드를 발급받아 소유하고 있으며, 이 5장의 카드중에 주이용카드는 무엇인지를 뽑아내려고 합니다.
SELECT DISTINCT 회원번호 , LAST_VALUE(카드번호) OVER(PARTITION BY 회원번호 ORDER BY 이용금액 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLWING) AS 주이용카드번호 FROM 회원별발급카드정보
이렇게 쿼리를 짰는데 회원 1명당 여러장의 카드를 가지고 있을 수 있다보니 DISTINCT를 걸어서 중복제거 했는데요..!
혹시 DISTINCT 없이 걸러낼 수 있는 방법 있을까요..??
회원 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 -- 추가 기준 적용 ;
마농님 답변 감사합니다!
요청자가 이용금액이 같을 경우 정렬된 순으로 가장 마지막 카드를 보여줘도 무방하다 합니다☺️
아, 그리고 제가 여쭤보기전에
rownumber로 변경을 해봤었는데
특정 회원번호 한사람으로 조건 걸고 비교해보니
속도차이가 아주 조금 있더라구요
(DISTINCT 썼을 때가 살짝 더 빨랐습니다)
이게 매일 2000만건 이상의 데이터를 처리해야 하는데 DISTINCT가 속도를 많이 잡아먹는다고
해서 변경하려던 참인데...
특정 A회원만 조건 걸고 뽑았을 땐 DISTINCT가 빨랐더라도 대량 데이터 처리하게 되면
RANK 나 ROW_NUMBER 속도가 빠를까요?
일단. 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 회원별발급카드정보 ;