본문 바로가기
데이터베이스[DB]/MSSQL

[MS-SQL] TOP, WITH TIES, ROW_NUMBER

by 낭만의개꿈 2025. 1. 17.

 

MS-SQL 에서 특정 행 수를 제한하여 출력을 할 때, 사용하기에 적합한 함수를 살펴보려고 한다. Oracle 에서는 ROWNUM 이라는 것을 사용하는데 MS-SQL 은 ROWNUM이라는 게 없다. 이에 TOP 이나 ROW_NUMBER 를 이용하여 출력하려는 자료의 갯수를 제한하거나 순번을 메겨서 표기할 수 있다.

TEST Table & Data Create
CREATE TABLE #tmp_data
(
	cust_id int,
	cust_name varchar(10),
	kr_lang int,
	math int
)

INSERT INTO #tmp_data VALUES (1,'홍길동',85,90)
INSERT INTO #tmp_data VALUES (2,'이순신',100,95)
INSERT INTO #tmp_data VALUES (3,'카네기',25,80)
INSERT INTO #tmp_data VALUES (4,'임꺽정',55,40)
INSERT INTO #tmp_data VALUES (5,'김진구',85,85)
INSERT INTO #tmp_data VALUES (6,'한나나',90,75)
INSERT INTO #tmp_data VALUES (7,'강구구',60,100)

 

테스트 자료 조회

 

TOP
  • 오라클의 ROWNUM 과 비슷하게 사용할 수 있다. TOP 으로 지정한 카운트만큼의 자료를 조회할 수 있다.
SELECT TOP 5 *
 FROM #tmp_data
ORDER BY kr_lang DESC

 

kr_lang ORDER 자료조회

 

ORDER BY 를 이용하여 kr_lang 의 높은 점수 기준으로 정렬한 후 TOP 5 로 상위 5개의 로우만 출력하도록 위와 같이 조회할 수 있다. 

 

TOP WITH TIES
  • TOP WITH TIES 를 이용하면 마지막 순위의 자료가 중복될 경우, 모두 조회한다.
SELECT TOP (3) WITH TIES kr_lang AS kr_lang_tie, 
		*
 FROM #tmp_data 
ORDER BY kr_lang DESC

 

kr_lang TOP WITH TIES 조회

 

ORDER BY 를 이용하여 kr_lang 의 높은 점수 기준으로 정렬하여 TOP3 를 추출하는데 kr_lang 이 동일한 자료가 있을 때, 위와 같이 TOP (3) WITH TIES kr_lang 을 이용하면 TOP 3 로 인한 3개의 행만 출력되는 게 아닌 kr_lang 의 마지막 3번째 숫자가 동일한 모든 자료도 조회가 처리된다. 이에 85점 중 그 다음이 기준이 없음으로 김진구, 홍길동이 모두 표기되는 것이다.

 

ROW_NUBMER
  • 조회 순번을 설정.
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum,
		*
 FROM #tmp_data 
ORDER BY kr_lang DESC

 

row_num 을 이용한 자료조회

 

자료에 조회 순번을 메겨서 특정 자료만큼씩 끊어서 표기해야하는 경우들이 있다. 이 때에 row_number 를 이용하여 자료들의 순번을 메겨서 조회하는 데 이용하는 것이다.

 

ROW_NUMBER 외에도 응용하여 자료에 순번을 메기는 건 이전에 작성한 아래의 내용도 추가적으로 참고가 될 것 같다.

 

2024.03.12 - [데이터베이스[DB]/MSSQL] - [MSSQL] RANK, DENSE_RANK, ROW_NUMBER, PARTITION BY 차이