dense 순위에서 한번더 조건 주는법.. 0 2 658

by 킨지 [SQL Query] [2021.01.15 12:14:48]


번호 이름 선정 점수 순위 인증여부 가격      
1001 Y 100 1 Y 1,000      
1002 N 100 1 Y 2,000      
1003 N 100 1 N 3,000      

여기서 순위는 dense를 썼구요 만약 점수가 동점일때 우선순위가 인증여부가 있는지 없는지 그것도 같다면 가격이 낮은자가 선정이 되는 방식입니다.

여기서 아래의 표처럼 하고싶은데 어떻게 방향을 잡아야할까요..

번호 이름 선정 점수 순위 인증여부   가격 인증선정여부 가격선정여부
1001 Y 100 1 Y   1,000 N Y
1002 N 100 1 Y   2,000 N N
1003 N 100 1 N   2,000 N N

  

by 마농 [2021.01.15 13:16:59]

굳이 각각의 Y/N 이 필요한지 모르겟네요?
최종 선정을 위한 우선항목들로 순위를 정하면 되지 않나요?
그리고, 가격마저 동일할 경우 대응방안은 있는지요?
, RANK() OVER(ORDER BY 점수 DESC, 인증여부 DESC, 가격) 순위

WITH 입찰(번호, 이름, 점수, 인증여부, 가격) AS
(
          SELECT 1001, '가', 100, 'Y', 1000 FROM dual      
UNION ALL SELECT 1002, '나', 100, 'Y', 2000 FROM dual      
UNION ALL SELECT 1003, '다', 100, 'N', 3000 FROM dual
)
SELECT 번호, 이름, 점수, 인증여부, 가격
     , rk1 순위_점수
     , rk2 순위_점수_인증
     , rk3 순위_점수_인증_가격
     , CASE WHEN rk1 = 1 AND cnt1 = 1 THEN 'Y' ELSE 'N' END 선정_점수
     , CASE WHEN rk2 = 1 AND cnt2 = 1 THEN 'Y' ELSE 'N' END 선정_점수_인증
     , CASE WHEN rk3 = 1 AND cnt3 = 1 THEN 'Y' ELSE 'N' END 선정_점수_인증_가격
  FROM (SELECT 번호, 이름, 점수, 인증여부, 가격
             , RANK() OVER(ORDER BY 점수 DESC) rk1
             , RANK() OVER(ORDER BY 점수 DESC, 인증여부 DESC) rk2
             , RANK() OVER(ORDER BY 점수 DESC, 인증여부 DESC, 가격) rk3
             , COUNT(*) OVER(PARTITION BY 점수) cnt1
             , COUNT(*) OVER(PARTITION BY 점수, 인증여부) cnt2
             , COUNT(*) OVER(PARTITION BY 점수, 인증여부, 가격) cnt3
          FROM 입찰
        )
;

 


by 킨지 [2021.01.15 15:32:54]

해결했습니다. 감사합니다. 모두 동점을 경우엔 따로 참고할수있는 테이블이 있어서 수월한데 그전일경우가 어려워서 헤매고있었습니다.ㅠ

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