티스토리 뷰

반응형

MSSQL에서 데이터 순서 지정하는 방법에 대해 알아보겠습니다. 특정 데이터 항목에 순서대로 번호를 매길 수 있는 함수 중에 자주 사용하는 함수는 ROW_NUMBER() 입니다. 이 함수를 사용하면 원하는 컬럼값을 오름차순이나 내림차순으로 정렬해 순서를 매길 수 있습니다. 

 

우선 ROW_NUMBER() 함수의 기본 구문에 대해서 알아보겠습니다.

ROW_NUMBER() OVER ( [PARTITION BY column1, column2, ...]
                    ORDER BY column1, column2, ...)

- PARTITION BY 절 (선택 사항): 이 절은 행 번호를 생성할 때 그룹을 지정하는 데 사용됩니다. 즉, 특정 열 또는 열의 조합에 따라 결과를 그룹화하고 각 그룹 내에서 행 번호가 재설정됩니다. 예를 들어, PARTITION BY column1, column2로 지정하면 column1과 column2의 값을 기준으로 그룹을 형성하고, 각 그룹 내에서 행 번호가 재설정됩니다.

- ORDER BY 절: 이 절은 행 번호를 할당할 때 사용할 정렬 기준을 지정합니다. 결과 집합의 행을 정렬하기 위해 하나 이상의 열을 지정할 수 있습니다. ORDER BY 절에 지정된 열의 순서에 따라 행 번호가 할당됩니다.

 

이것만으로는 이해하기 쉽지 않기 때문에 예제를 통해 자세히 알아보겠습니다.

SELECT CategoryID, ProductID, ProductName, 
       ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY ProductID) AS RowNum
FROM Products

이 쿼리는 Products 테이블에서 CategoryID를 기준으로 그룹화하고 각 그룹 내에서 ProductID를 기준으로 행 번호를 할당합니다. 다음의 각 CategoryID 그룹 내에서 ProductID에 따라 행 번호가 할당되는 가상의 실행 결과입니다.

CategoryID  ProductID  ProductName  RowNum
----------- ---------- ------------ -------
1           100        Product A    1
1           200        Product B    2
1           300        Product C    3
2           150        Product X    1
2           250        Product Y    2
2           350        Product Z    3

위의 결과에서 CategoryID 1, 2로 먼저 구분되고 각 그룹 내에서 ProductID 정렬 순서에 따라 RowNum가 할당된 모습을 보실 수 있습니다. ProductName 컬럼은 정렬순서와는 관계없지만 SELECT 절에 선언됐기 때문에 같이 출력됩니다.

 

위 예제에서 PARTITION BY 절을 생략하면 결과값은 다음과 같이 변경됩니다.,

CategoryID  ProductID  ProductName  RowNum
----------- ---------- ------------ -------
1           100        Product A    1
2           150        Product X    2
1           200        Product B    3
2           250        Product Y    4
1           300        Product C    5
2           350        Product Z    6

CategoryID를 기준은 그룹핑하는 모습은 사라지고 ProductID를 기준으로만 RowNum가 할당되는 모습을 볼 수 있습니다,

 

이 기능을 잘 응용하면 상위 N개의 행에 해당하는 값만 가져오거나 각 그룹별로 특정 조건에 따른 첫번째 행에 해당하는 값들도 가져올 수 있습니다. 예를 들어 주문 데이터 중에서는 가장 최근에 주문한 10개의 데이터만 가져올 수 있습니다. 여러분 모두 응용력을 발휘해서 다양한 현장 속 쿼리 작성 시 도움이 되시길 바라겠습니다.

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함