DB는 오라클입니다.
WITH TABLE AS
(
SELECT 'A' AS PRODUCT_ID, 69998 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'B' AS PRODUCT_ID, 69997 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'C' AS PRODUCT_ID, 69000 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'D' AS PRODUCT_ID, 66000 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'E' AS PRODUCT_ID, 65999 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'F' AS PRODUCT_ID, 3000 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'G' AS PRODUCT_ID, 2000 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'H' AS PRODUCT_ID, 1000 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'I' AS PRODUCT_ID, 7 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'J' AS PRODUCT_ID, 5 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
UNION ALL
SELECT 'K' AS PRODUCT_ID, 2 AS WEIGHT, 5 AS MAX_GRP_NO, 70000 AS GRP_MAX_WEIGHT FROM DUAL
)
원본
PRODUCT_ID | WEIGHT | MAX_GRP_NO | GRP_MAX_WEIGHT |
A | 69998 | 5 | 70000 |
B | 69997 | 5 | 70000 |
C | 69000 | 5 | 70000 |
D | 66000 | 5 | 70000 |
E | 65999 | 5 | 70000 |
F | 3000 | 5 | 70000 |
G | 2000 | 5 | 70000 |
H | 1000 | 5 | 70000 |
I | 7 | 5 | 70000 |
J | 5 | 5 | 70000 |
K | 2 | 5 | 70000 |
그룹 조건
PRODUCT_ID: 제품, WEIGHT: 중량, MAX_GRP_NO: 최대그룹번호, GRP_MAX_WEIGHT: 그룹최대중량
1. 그룹이 없는 제품의 중량이 가장 작은 값이 그룹이 없는 제품의 중량이 가장 큰 값과 그룹이 됩야합니다.
2. 큰 중량과 작은 중량의 합이 그룹최대중량을 초과할 경우는 작은 중량은 큰 중량과 같은 그룹이 될수 없고 큰 중량의 제품만 혼자 그룹이 됩니다.
3. 만약 제품의 가장 작은 중량이 그룹최대중량 초과로 그룹이 안되었다면 다음 그룹이 없는 가장 큰 중량 제품과 그룹이 되어야합니다.
4. 그룹의 첫번째 중량이 큰순서로 그룹번호: 1, 그룹번호: 2, 그룹번호: 3이 되야합니다.
5. 그룹번호가 최대그룹번호를 넘을 수 없습니다.
6. 그룹이 없는 제품들은 다시 중량이 큰 것 중량이 작은것 순으로 그룹최대중량이 넘지 않는 가장 빠른 그룹번호로 같은 그룹이 되야합니다.
원하는 결과
PRODUCT_ID | WEIGHT | GRP_NO |
A | 69998 | 1 |
B | 69997 | 2 |
C | 69000 | 3 |
D | 66000 | 4 |
E | 65999 | 5 |
F | 3000 | 4 |
G | 2000 | 5 |
H | 1000 | 5 |
I | 7 | 4 |
J | 5 | 3 |
K | 2 | 1 |
조건 설명이 부족하다면 댓글 부탁드립니다..