데이터베이스를 다루다 보면 특정 조건에 따라 순차적인 번호를 부여해야 할 때가 있다.
이번 포스팅에서는 SQL의 ROW_NUMBER() 함수를 사용하여 각 그룹 내에서 순차적인 번호를 부여하는 방법에 대해 알아보자.
예시 상황
다음과 같은 [구매내역] 테이블이 있다고 가정하자.
구매번호 | 아이템코드 | 구매일자 | 물품명 | 단가 | 수량 |
1001 | A001 | 2024-01-01 | 노트북 | 1000 | 2 |
1001 | A002 | 2024-01-01 | 마우스 | 50 | 1 |
1001 | A001 | 2024-01-01 | 노트북 | 1000 | 1 |
1002 | A003 | 2024-01-02 | 키보드 | 70 | 1 |
1002 | A004 | 2024-01-02 | 모니터 | 200 | 2 |
1002 | A003 | 2024-01-03 | 키보드 | 70 | 2 |
각 [구매번호]와 [아이템코드]내에서 순차적인 [항목번호]를 부여하고 싶다면, ROW_NUMBER() 함수를 사용하여 다음과 같이 쿼리를 작성할 수 있다.
SELECT
구매번호,
아이템코드,
구매일자,
물품명,
단가,
수량,
ROW_NUMBER() OVER (PARTITION BY 구매번호, 아이템코드 ORDER BY 구매번호, 아이템코드) AS 항목번호
FROM 구매내역
ORDER BY 구매번호, 아이템코드, 항목번호;
쿼리 설명
위 쿼리에서 ROW_NUMBER() OVER (PARTITION BY 구매번호, 아이템코드 ORDER BY 구매번호, 아이템코드) 부분이 핵심이다. 이 함수는 구매번호와 아이템코드별로 그룹을 만들고, 각 그룹 내에서 순차적인 번호를 부여한다.
- PARTITION BY 구매번호, 아이템코드: 구매번호와 아이템코드가 같은 행끼리 하나의 그룹으로 묶는다.
- ORDER BY 구매번호, 아이템코드: 그룹 내에서 정렬 기준을 지정. 여기서는 구매번호와 아이템코드를 기준으로 정렬.
쿼리 결과는 아래와 같다.
구매번호 | 아이템코드 | 구매일자 | 물품명 | 단가 | 수량 | 항목번호 |
1001 | A001 | 2024-01-01 | 노트북 | 1000 | 2 | 1 |
1001 | A001 | 2024-01-01 | 노트북 | 1000 | 1 | 2 |
1001 | A002 | 2024-01-01 | 마우스 | 50 | 1 | 1 |
1002 | A003 | 2024-01-02 | 키보드 | 70 | 1 | 1 |
1002 | A003 | 2024-01-03 | 키보드 | 70 | 2 | 2 |
1002 | A004 | 2024-01-02 | 모니터 | 200 | 2 | 1 |
이와 같이 ROW_NUMBER() 함수를 사용하면, 각 구매번호와 아이템코드 내에서 순차적인 항목번호를 쉽게 부여할 수 있다.
반응형
'Dev > DB' 카테고리의 다른 글
[DB] Oracle AWR 스냅샷을 활용한 SQL 성능 분석 (0) | 2024.08.20 |
---|---|
[ORACLE] 오라클 쿼리 로그 확인하기 (0) | 2024.08.13 |
[ORACLE] 트리거(Trigger)를 이용한 테이블 수정 이력 관리 (0) | 2024.06.21 |
[ORACLE] 데이터 랜덤값으로 변경하기(dbms_random) (0) | 2024.04.30 |
[ORACLE] 시퀀스(Sequence) 생성, 변경, 삭제 (0) | 2024.03.18 |