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'청계천로';
자주 쓰는 패턴
중복 제거(최신 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_NUMBER와 RANK 차이는?
ROW_NUMBER는 값이 같아도 번호가 중복 없이 1씩 증가합니다. RANK는 동순위 발생 시 번호가 건너뜁니다(1,1,3…).
Q2. 정렬 기준이 없으면?
엔진 내부 계획에 따라 실행 때마다 순서가 달라질 수 있습니다. 보여주기용 번호라도 ORDER BY 지정이 안전합니다.
Q3. 성능 팁은?
ORDER BY와 PARTITION BY에 쓰이는 컬럼에 적절한 인덱스를 두면 정렬/윈도우 연산이 빨라집니다.
참고 자료
- Microsoft Learn — ROW_NUMBER (Transact-SQL)
- Microsoft Learn — RANK (Transact-SQL)
- Microsoft Learn — DENSE_RANK (Transact-SQL)
- Microsoft Learn — NTILE (Transact-SQL)
함께 보면 좋은 글
- MSSQL TOP 원하는 행 수(개수) 만큼 지정하는 방법 (SELECT 절)
- MSSQL DISTINCT 중복 행 제거하는 방법 (SELECT 절)
- MSSQL ORDER BY 절 데이터 정렬 방법(순서 지정) 오름차순, 내림차순
- MSSQL GROUP BY 절, HAVING 절 사용법
- MSSQL COUNT, SUM, AVG, MAX, MIN 사용법 – 집계 함수
이 글이 도움이 되셨다면 공유 부탁 드립니다.


![[SSMS] 로컬 서버(PC)에 설치한 MSSQL 서버 연결하는 방법](https://bluesharehub.com/wp-content/uploads/2022/02/img_41.png)
