순번 | 품번 | 색상 | 섬유 | 함유량 | 그룹 |
1 | A | B | COTN | 99 | 1 |
2 | A | B | POLY | 1 | 1 |
3 | A | C | COTN | 99 | 1 |
4 | A | C | POLY | 1 | 1 |
5 | A | D | COTN | 80 | 2 |
6 | A | D | POLY | 20 | 2 |
7 | A | E | COTN | 80 | 3 |
8 | A | E | POLY | 18 | 3 |
9 | A | E | SPAN | 2 | 3 |
색상B 와 색상C 는 같은 섬유/함유량을 가지고 있기때문에 같은 그룹으로 묶였고,
색상D 와 색상E 는 섬유 구성과 함유량이 달라 각각 다른 그룹으로 묶였습니다.
위와같은 조건의 여러행을 비교하여 그룹짓고 순번을 매길 수 있는 방법은 어떻게 하여야 할까요?
선배님들의 자문을 구합니다.
WITH t AS ( SELECT 1 순번, 'A' 품번, 'B' 색상, 'COTN' 섬유, 99 함유량 FROM dual UNION ALL SELECT 2, 'A', 'B', 'POLY', 1 FROM dual UNION ALL SELECT 3, 'A', 'C', 'COTN', 99 FROM dual UNION ALL SELECT 4, 'A', 'C', 'POLY', 1 FROM dual UNION ALL SELECT 5, 'A', 'D', 'COTN', 80 FROM dual UNION ALL SELECT 6, 'A', 'D', 'POLY', 20 FROM dual UNION ALL SELECT 7, 'A', 'E', 'COTN', 80 FROM dual UNION ALL SELECT 8, 'A', 'E', 'POLY', 18 FROM dual UNION ALL SELECT 9, 'A', 'E', 'SPAN', 2 FROM dual ) SELECT 순번, 품번, 색상, 섬유, 함유량 , DENSE_RANK() OVER(PARTITION BY 품번 ORDER BY 색상_1) grp , 원료 FROM (SELECT 순번, 품번, 색상, 섬유, 함유량 , 원료 , MIN(색상) OVER(PARTITION BY 품번, 원료) 색상_1 FROM (SELECT 순번, 품번, 색상, 섬유, 함유량 , LISTAGG(섬유||' '||함유량||'%', ', ') WITHIN GROUP(ORDER BY 함유량 DESC, 섬유) OVER(PARTITION BY 품번, 색상) 원료 FROM t ) ) ORDER BY 품번, 색상_1, 색상, 함유량 DESC, 섬유 ;