안녕하세요 구루비 회원님들~
조회 조건의 어려움이 있어 이렇게 부탁 드려봅니다.
번호(NO) | 이름(NAME) | 생일(B) | 몸무게(W) | 비고 |
1 | 홍길동 | 1981-07 | 80 | |
2 | 홍길동 | 1981-06 | 90 | |
3 | 홍길동 | 1981-06 | 90 |
이런 데이터가 있다고 가정했을때
3명의 홍길동 중
1. 같은 3명의 이름중에 생일이 가장 빠른 사람들로 부터 묶는다. (2번과 3번)
2. 묶은 그룹중 몸무게가 가장 많이 나가는 사람을 묶는다. (둘다 몸무게가 같으므로 다시 2번과 3번)
3. 또 묶은 그룹중 번호가 가장 많은 사람으로 묶는다 ( 결론 : 번호 3번)
이렇게 서브쿼리를 사용하여 표현하고싶은데 어려움이 있어서 질문드립니다.
* 테이블 이름이 AAA 라는 가정하에
SELECT * FROM AAA AA WHERE AA.B = ( SELECT MIN(BB.B) FROM AAA BB WHERE BB.NAME = AA.NAME )
이렇게 하면 우선 생일이 가장빠른 1981-06인 2번과 3번 두사람이 묶이는걸 볼수있는데
그 후로 막히네요 시원한 답변 부탁 드립니다 ^^
아래와 같은 것을 원하시는 게 아닌가요?
WITH AAA AS ( SELECT 1 NO, '홍길동' NAME, '1981-07' B, 80 W FROM DUAL UNION ALL SELECT 2 NO, '홍길동' NAME, '1981-06' B, 90 W FROM DUAL UNION ALL SELECT 3 NO, '홍길동' NAME, '1981-06' B, 90 W FROM DUAL UNION ALL SELECT 4 NO, '홍길동' NAME, '1981-07' B, 100 W FROM DUAL UNION ALL SELECT 5 NO, '홍길순' NAME, '1981-10' B, 80 W FROM DUAL UNION ALL SELECT 6 NO, '홍길순' NAME, '1981-05' B, 70 W FROM DUAL UNION ALL SELECT 7 NO, '홍길순' NAME, '1981-05' B, 70 W FROM DUAL UNION ALL SELECT 8 NO, '홍길순' NAME, '1981-05' B, 65 W FROM DUAL ) SELECT NO, NAME, B, W FROM ( SELECT NO, NAME, B, W, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY B ASC, W DESC, NO DESC) RN FROM AAA ) WHERE RN = 1 ; 또는 WITH AAA AS ( SELECT 1 NO, '홍길동' NAME, '1981-07' B, 80 W FROM DUAL UNION ALL SELECT 2 NO, '홍길동' NAME, '1981-06' B, 90 W FROM DUAL UNION ALL SELECT 3 NO, '홍길동' NAME, '1981-06' B, 90 W FROM DUAL UNION ALL SELECT 4 NO, '홍길동' NAME, '1981-07' B, 100 W FROM DUAL UNION ALL SELECT 5 NO, '홍길순' NAME, '1981-10' B, 80 W FROM DUAL UNION ALL SELECT 6 NO, '홍길순' NAME, '1981-05' B, 70 W FROM DUAL UNION ALL SELECT 7 NO, '홍길순' NAME, '1981-05' B, 70 W FROM DUAL UNION ALL SELECT 8 NO, '홍길순' NAME, '1981-05' B, 65 W FROM DUAL ) SELECT TO_NUMBER(SUBSTR(BWNO, -3)) NO, NAME, SUBSTR(BWNO, 1, 7) B, TO_NUMBER(SUBSTR(BWNO, 9, 3)) W FROM ( SELECT NAME, MIN(B||'^'||WNO) BWNO FROM ( SELECT NAME, B, MAX(LPAD(W, 3, '0')||'^'||LPAD(NO, 3, '0')) WNO FROM AAA GROUP BY NAME, B ) GROUP BY NAME ) ;