IT 개발

[오라클|Oracle] GROUP 별로 따로 ROWNUM 주기 - PARTITION BY

쭈니루 2014. 7. 17. 09:00
반응형

SELECT '가족' A, '아버지' B FROM DUAL
UNION
SELECT '가족' A, '어머니' B FROM DUAL
UNION
SELECT '가족' A, '형' B FROM DUAL
UNION
SELECT '가족' A, '누나' B FROM DUAL
UNION
SELECT '친가' A, '삼촌' B FROM DUAL
UNION
SELECT '친가' A, '고모' B FROM DUAL
UNION
SELECT '외가' A, '외삼촌' B FROM DUAL
UNION
SELECT '외가' A, '이모' B FROM DUAL

 

ORDER BY B;

 

   A  B
 1  가족  누나
 2  가족  아버지
 3  가족  어머니
 4  가족  형
 5  외가  외삼촌
 6  외가  이모
 7  친가  고모
 8  친가  삼촌

 

라는 테이블이 있습니다. 이 테이블에 ROWNUM을 부여하고 싶습니다.

일반적으론 아래와 같이 하실 겁니다.

 

SELECT ROWNUM,
   A,
   B
 FROM (
    SELECT '가족' A, '아버지' B FROM DUAL
    UNION
    SELECT '가족' A, '어머니' B FROM DUAL
    UNION
    SELECT '가족' A, '형' B FROM DUAL
    UNION
    SELECT '가족' A, '누나' B FROM DUAL
    UNION
    SELECT '친가' A, '삼촌' B FROM DUAL
    UNION
    SELECT '친가' A, '고모' B FROM DUAL
    UNION
    SELECT '외가' A, '외삼촌' B FROM DUAL
    UNION
    SELECT '외가' A, '이모' B FROM DUAL
    ORDER BY A, B)

 

   ROWNUM  A  B
 1  1  가족  누나
 2  2  가족  아버지
 3  3  가족  어머니
 4  4  가족  형
 5  5  외가  외삼촌
 6  6  외가  이모
 7  7  친가  고모
 8  8  친가  삼촌

 

 하지만, 우리가 원하는 것은 A 컬럼의 Group 별로 ROWNUM을 주고 싶은 겁니다.

 

SELECT
   ROW_NUMBER() OVER(PARTITION BY A ORDER BY A, B) RNUM,
   A,
   B
 FROM (
    SELECT '가족' A, '아버지' B FROM DUAL
    UNION
    SELECT '가족' A, '어머니' B FROM DUAL
    UNION
    SELECT '가족' A, '형' B FROM DUAL
    UNION
    SELECT '가족' A, '누나' B FROM DUAL
    UNION
    SELECT '친가' A, '삼촌' B FROM DUAL
    UNION
    SELECT '친가' A, '고모' B FROM DUAL
    UNION
    SELECT '외가' A, '외삼촌' B FROM DUAL
    UNION
    SELECT '외가' A, '이모' B FROM DUAL
    ORDER BY A, B)

 

   RNUM  A  B
 1  1  가족  누나
 2  2  가족  아버지
 3  3  가족  어머니
 4  4  가족  형
 5  1  외가  외삼촌
 6  2  외가  이모
 7  1  친가  고모
 8  2  친가  삼촌

 

 이렇게 조회가 됩니다.

반응형