SQL Server 2005 온라인 설명서
ROW_NUMBER(Transact-SQL)
SELECT ROW_NUMBER ( ) OVER ( PARTITION BY PART_NO ORDER BY STK_YM ASC) AS SEQ_NO,
STK_YM, PART_NO, GD_IM_QTY
FROM dbo.EIV_STOCK
결과 집합 파티션 내의 행 일련 번호를 반환합니다. 각 파티션의 첫 번째 행은 1로 시작합니다.
Transact-SQL 구문 표기 규칙
구문
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
주의
ORDER BY 절은 지정된 파티션 내에서 행에 고유 ROW_NUMBER가 할당되는 순서를 결정합니다.
인수
<partition_by_clause>
FROM 절이 생성한 결과 집합을 ROW_NUMBER 함수가 적용되는 파티션으로 나눕니다.
<order_by_clause>
파티션에서 ROW_NUMBER 값이 행에 할당되는 순서를 결정합니다. 자세한 내용은 ORDER BY 절(Transact-SQL)를 참조하십시오.
자세한 내용은 OVER 절(Transact-SQL)를 참조하십시오.
----------------------
SQL Tip 4: rownum와 row_number() 의 차이
Rownum 과 ROW_NUMBER 의 차이.
rownum의 제약사항.
1.
select username,rownum from dba_users order by username;?
USERNAME ROWNUM
------------------------------------------ ---------------
OUTLN 3
SYS 1
SYSTEM 2
rownum은 order by하기 전에의 조회될 row의 순서를 말한다.
이를 풀기 원하는 대로(username으로 sort된 순서로) 받기를 원하면
SELECT username,rownum
FROM
(SELECT username
FROM dba_users
ORDER BY username)
이렇게 해야 한다.
2. 또한 rownum은 조건절에 항상 %!^arownum < 4%!^a와 같이 %!^a보다 작다%!^a 혹은 %!^a같거나 작다%!^a 만
사용할 수 있다. 즉 %!^arownum > 4%!^a는 결과를 return하지 못한다.
- row_number 는... 위와 같은 제약사항이 없다.
- 또한 row_number는 rownum과 연관되어 있지 않다.
- row_number는 partition으로 구분된 set의 order by 순서로 값을 생성한다.
ex)
-- 부서별로, 급여의 순서를 알아보자.
select deptno, empno, sal,
row_number() over (partition by deptno order by sal desc) as sal_rank_dept
from emp;
DEPTNO EMPNO SAL SAL_RANK_DEPT
---------- ---------- ---------- -------------
10 7839 5000 1
10 7782 2450 2
10 7934 1300 3
20 7788 3000 1
20 7902 3000 2
20 7566 2975 3
20 7876 1100 4
20 7369 800 5
30 7698 2850 1
30 7499 1600 2
30 7844 1500 3
30 7521 1250 4
30 7654 1250 5
30 7900 950 6