MSSQL 순번 매기기, 순서 지정 방법 (ROW_NUMBER)

MSSQL 순번 매기기, 순서 지정 방법 (ROW_NUMBER)

SQL Server에서 결과 집합에 일련번호를 부여하려면 ROW_NUMBER()를 사용합니다. 그룹별 초기화가 필요하면 PARTITION BY를, 기준 정렬이 있으면 ORDER BY를 지정합니다. 비슷한 함수로 RANK, DENSE_RANK, NTILE가 있지만, 단순히 1부터 N까지 번호를 붙이는 데에는 ROW_NUMBER()가 가장 적합합니다.

  • 테스트 환경: Microsoft SQL Server 2019, SSMS 18.10
  • 주요 사용처: 페이지네이션, 화면 표기용 행 번호, 그룹 내 순번, 중복 제거(CTE+ROW_NUMBER) 등

구문

▶ 결과 집합 데이터 내의 행 일련번호를 반환합니다. 첫 번째 행은 1로 시작합니다.

ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... ] ORDER BY order_by_expression )
  • PARTITION BY: 그룹을 나누어 각 그룹마다 1부터 다시 번호 매김(선택).
  • ORDER BY: 번호를 매기는 기준(필수). 기준이 없으면 결과가 비결정적일 수 있음.

사용 예제

1) 정렬 기준 없이 임의 일련번호 표시

ORDER BY (SELECT 1)은 임의 번호를 주는 기법으로, 재실행 시 순서가 바뀔 수 있습니다.

SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [Row#],
        COLUMN1, COLUMN5, COLUMN7, COLUMN2, COLUMN4
FROM    BS_ROAD WITH (NOLOCK)
WHERE   COLUMN5 = N'서울특별시'
  AND   COLUMN2 = N'청계천로';
정렬이 필요 없이 일련번호 표시 방법 예시 화면입니다.

2) 정렬 기준이 있는 경우

SELECT  ROW_NUMBER() OVER (ORDER BY COLUMN5, COLUMN2) AS [Row#],
        COLUMN1, COLUMN5, COLUMN7, COLUMN2, COLUMN4
FROM    BS_ROAD WITH (NOLOCK)
WHERE   COLUMN5 = N'서울특별시'
  AND   COLUMN2 = N'청계천로';
정렬이 있는 경우 일련번호 표시 방법 예시 화면입니다.

3) PARTITION BY로 그룹별 순번 매기기

SELECT  ROW_NUMBER() OVER (PARTITION BY COLUMN7
                           ORDER BY COLUMN5, COLUMN2) AS [Row#],
        COLUMN1, COLUMN5, COLUMN7, COLUMN2, COLUMN4
FROM    BS_ROAD WITH (NOLOCK)
WHERE   COLUMN5 = N'서울특별시'
  AND   COLUMN2 = N'청계천로';
PARTITION BY 절 추가 예시 화면입니다.

자주 쓰는 패턴

중복 제거(최신 1건만 남기기)

WITH cte AS (
  SELECT *,
         ROW_NUMBER() OVER (
           PARTITION BY BusinessKey
           ORDER BY UpdatedAt DESC
         ) AS rn
  FROM   dbo.YourTable
)
SELECT *
FROM   cte
WHERE  rn = 1;

페이지네이션(예: 21~40행)

WITH numbered AS (
  SELECT ROW_NUMBER() OVER (ORDER BY CreatedAt DESC) AS rn, *
  FROM   dbo.Posts
)
SELECT *
FROM   numbered
WHERE  rn BETWEEN 21 AND 40;

FAQ

Q1. ROW_NUMBERRANK 차이는?
ROW_NUMBER는 값이 같아도 번호가 중복 없이 1씩 증가합니다. RANK는 동순위 발생 시 번호가 건너뜁니다(1,1,3…).

Q2. 정렬 기준이 없으면?
엔진 내부 계획에 따라 실행 때마다 순서가 달라질 수 있습니다. 보여주기용 번호라도 ORDER BY 지정이 안전합니다.

Q3. 성능 팁은?
ORDER BYPARTITION BY에 쓰이는 컬럼에 적절한 인덱스를 두면 정렬/윈도우 연산이 빨라집니다.

참고 자료

위로 스크롤