GROUPBY_NUM() 함수는 ROWNUM 혹은 INST_NUM() 함수와 함께, 결과 행들의 개수를 제한하는 목적으로 사용된다. 단, 차이점은 GROUP BY … HAVING 절 뒤에 결합되어 사용되며, 이미 정렬을 수행한 결과에 대해 순서를 부여한다는 점이다. 또한, INST_NUM() 함수는 스칼라(scalar) 함수이지만, GROUPBY_NUM() 함수는 집계 함수의 일종이다.
즉, GROUP BY 절이 포함된 SELECT 문장에서 조건 절에 ROWNUM을 이용하여 일부 결과 행들만 조회하는 경우, ROWNUM이 먼저 적용된 후 GROUP BY에 의한 그룹 정렬이 수행된다. 반면, GROUPBY _NUM() 함수를 이용하여 일부 결과 행들만 조회하는 경우, GROUP BY에 의한 그룹 정렬이 이루어진 결과에 대해서 ROWNUM이 적용된다.
GROUPBY_NUM()
다음은 history 테이블에서 과거 5개의 올림픽에 대해서 최단 기록을 조회하는 예제이다. (demodb)
--Group-ordering first and then limiting rows using GROUPBY_NUM()
SELECT host_year, MIN(score) FROM history
GROUP BY host_year HAVING GROUPBY_NUM() BETWEEN 1 AND 5;
=== <Result of SELECT Command in Line 2> ===
host_year min(score)
===================================
1968 '8.9'
1980 '01:53.0'
1984 '13:06.0'
1988 '01:58.0'
1992 '02:07.0'
5 rows selected.
--Limiting rows first and then Group-ordering using ROWNUM
SELECT host_year, MIN(score) FROM history
WHERE ROWNUM BETWEEN 1 AND 5 GROUP BY host_year;
=== <Result of SELECT Command in Line 2> ===
host_year min(score)
===================================
2000 '03:41.0'
2004 '01:45.0'
2 rows selected.