번호 | 이름 | 선정 | 점수 | 순위 | 인증여부 | 가격 | |||
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 |
굳이 각각의 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 입찰 ) ;