경진의 블로그

RANK를 사용하지 않고 순위를 구하는 방법 본문

자바개발과정/오라클(Oracle)

RANK를 사용하지 않고 순위를 구하는 방법

aith 2008. 5. 26. 00:17
RANK를 사용하지 않고 순위를 구하는 방법

문제 (꼭 기억해야함!!)
time_nu가 가장 빠른 순위를 구한다

SELECT *
  FROM t_worktime A
      ,t_worktime B

SELECT *
  FROM t_worktime A
      ,t_worktime B
 WHERE A.time_nu > B.time_nu

SELECT A.workcd_vc
      ,A.time_nu
      ,COUNT(B.seq_vc) AS "RNK"
  FROM t_worktime A
      ,t_worktime B
 WHERE A.time_nu > B.time_nu
GROUP BY A.workcd_vc, A.time_nu

현재 14개의 로우만이 나와 있는 이유는 B테이블의 TIME_NU가 A테이블 보다 작은 것으로 조인을 하였고 B의 카운트를 센 것이다. 그러므로 A가 B보다 작은 것은 현재 출력되지 않는다.

이것은 GROUP BY를 A로 하기 위해서 그런 것이지만 A의 나머지 한 값을 출력하기 위해서는 B.TIME_NU에 OUTER JOIN을 위해(+)를 해 주어야 조건에 의해 보이지 않았던 결과 값 하나가 추가될 것이며 그로 인해 자료는 15개가 된다.

SELECT
       A.workcd_vc
      ,A.time_nu
      ,COUNT(B.seq_vc) AS "RNK"
  FROM t_worktime A
      ,t_worktime B
 WHERE A.time_nu > B.time_nu(+)
GROUP BY A.workcd_vc, A.time_nu

그리고 그 마지막 자료는 WHERE절의 A.time_nu > B.time_nu에 의해 RNK가 0으로 찍힐 것이고 순위를 결정하는 것이므로 그 카운트에 1을 더해 줌으로써 순위의 형식으로 출력되는 것이다.

이제 순위를 차례대로 보기 위해 COUNT(B.seq_vc)로 ORDER BY를 한다.

SELECT
       A.workcd_vc
      ,A.time_nu
      ,COUNT(B.seq_vc)+1 AS "RNK"
  FROM t_worktime A
      ,t_worktime B
 WHERE A.time_nu > B.time_nu(+)
GROUP BY A.workcd_vc, A.time_nu
ORDER BY count(B.seq_vc)

'자바개발과정 > 오라클(Oracle)' 카테고리의 다른 글

EQUI JOIN  (0) 2008.05.27
JOIN  (0) 2008.05.27
RANK를 사용하지 않고 순위를 구하는 방법  (0) 2008.05.26
DENSE_RANK & RANK 연습문제  (0) 2008.05.26
UNION & UNION ALL 연습문제  (0) 2008.05.26
오라클 함수 연습문제  (0) 2008.05.26
0 Comments
댓글쓰기 폼