여러행의 그룹 및 채번 0 5 1,315

by zbra [PL/SQL] [2022.06.07 13:40:59]


순번 품번 색상 섬유 함유량 그룹
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 는 섬유 구성과 함유량이 달라 각각 다른 그룹으로 묶였습니다.

위와같은 조건의 여러행을 비교하여 그룹짓고 순번을 매길 수 있는 방법은 어떻게 하여야 할까요?

선배님들의 자문을 구합니다.

 

by 마농 [2022.06.07 13:56:49]

그룹 순서의 기준이 별도로 있는지?
아니면. 순서 기준 없이 그룹핑만 잘되면 되는지?
순서 기준이 있다면 어떤 기준인지?


by zbra [2022.06.07 14:01:00]

그룹의 순서는 없습니다만, 굳이 정하자면 품번/색상의 ASC 정도가 될것같습니다.


by 마농 [2022.06.07 14:08:00]
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, 섬유
;

 


by zbra [2022.06.07 15:42:41]

말씀주셨던 순서기준이 섬유와 함유량의 기준이였군요
주신 쿼리 잘 이해 하였습니다.
원료 라는 칼럼도 정말 유용하게 쓸 수 있을 것 같습니다.
오라클 버전이 10g 여서 WM_CONCAT 이용하여 유사하게 구현하였습니다.

정말 감사합니다.
 


by 마농 [2022.06.07 16:07:16]

(함유량 DESC, 섬유) 순서는 색상 안에서의 순서로 제가 임의로 정했습니다. (함유량 많은거 우선)
먼저 언급했던 순서는 그룹들 간의 순서로 (색상_1) 을 기준으로 했습니다.

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