ex) 칼럼이 두 개 있습니다. 하나는 학생규모(emp)이고, 나머지 하나는 선호도(like)입니다.(1,2,3,4,5)
학생규모별 가장 선호하는 값을 rownumber, partion by로 조회 하려 합니다.
단, emp를 그대로 사용하지 않고
emp <= 10 then 'e1' , else 'e2 이렇게 case when을 이용하여 범위별 카데고리를 하나 추가 해서 만들고 싶습니다.
어떻게 구문을 짜야 아래 두 번째 표처럼 값이 나올까요?? ㅠㅠ
emp | like |
4 | 1 |
10 | 2 |
7 | 3 |
5 | 3 |
102 | 5 |
1035 | 5 |
54 | 5 |
228 | 5 |
30 | 4 |
size | like |
e1 | 3 |
e2 | 5 |
예전에 저도 비슷한 질문한 적이 있었는데 마농님 주신 답변 참고해서 만들어 봤습니다.
with t as ( select 4 emp, 1 lk from dual union all select 10 , 2 from dual union all select 7 , 3 from dual union all select 5 , 3 from dual union all select 102 , 5 from dual union all select 1035 , 5 from dual union all select 54 , 5 from dual union all select 228 , 5 from dual union all select 30 , 4 from dual ) SELECT * FROM ( SELECT sz , lk , ROW_NUMBER() OVER (PARTITION BY sz ORDER BY cnt DESC) rn FROM (SELECT sz , lk , COUNT(*) OVER (PARTITION BY sz, lk) cnt FROM (SELECT lk , CASE WHEN emp <= 10 THEN 'e1' ELSE 'e2' END sz FROM t ) a ) ) WHERE rn = 1 ;
WITH t AS ( SELECT 4 emp, 1 lk FROM dual UNION ALL SELECT 10, 2 FROM dual UNION ALL SELECT 7, 3 FROM dual --UNION ALL SELECT 5, 3 FROM dual -- 동점 발생 테스트 UNION ALL SELECT 102, 5 FROM dual UNION ALL SELECT 1035, 5 FROM dual UNION ALL SELECT 54, 5 FROM dual UNION ALL SELECT 228, 5 FROM dual UNION ALL SELECT 30, 4 FROM dual ) SELECT sz , LISTAGG(lk, ',') WITHIN GROUP(ORDER BY lk) lk FROM (SELECT sz, lk , RANK() OVER(PARTITION BY sz ORDER BY COUNT(*) DESC) rk FROM (SELECT lk , CASE WHEN emp <= 10 THEN 'e1' ELSE 'e2' END sz FROM t ) GROUP BY sz, lk ) WHERE rk = 1 GROUP BY sz ;