경진의 블로그

DENSE_RANK & RANK 연습문제 본문

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

DENSE_RANK & RANK 연습문제

aith 2008. 5. 26. 00:15
DENSE_RANK & RANK 연습문제

첨부 파일
 

DENSE_RANK와 일반 RANK의 차이는 순위를 매기는 방법의 차이에 있다.

SELECT point_nu
     , rank() over(order by point_nu desc) rank
     , dense_rank() over(order by point_nu desc) d_rank
  FROM t_greport
 WHERE grade_vc = 1;

문제1
T_WORKTIME의 자료를 가지고 작업코드(WORKCD_VC)를 기준으로 그룹을 지은 후 그 그룹별 작업 시간의 평균을 가지고 순위를 구하자.
  (단, 평균 시간은 소수점 셋째 자리에서 반올림)

SELECT
       a.workcd_vc
      ,a.avg_timea
      ,count(b.workcd_vc)+1 as rnk
  FROM (
        SELECT
               workcd_vc
              ,round(avg(time_nu),2) avg_timea
          FROM t_worktime
        GROUP BY workcd_vc
       )a,
       (
        SELECT
               workcd_vc
              ,round(avg(time_nu),2) avg_timeb
          FROM t_worktime
        GROUP BY workcd_vc
       )b
 WHERE a.avg_timea > b.avg_timeb(+)
 GROUP BY a.workcd_vc,a.avg_timea
 ORDER BY rnk;

만약 작업코드별로 그룹을 지어서 그 그룹 내에 작업시간의 순위를 결정한다면 PARTITION BY가 들어가게 된다.

SELECT workcd_vc
     , time_nu
     , rank() over(partition by workcd_vc order by time_nu) rnk
  FROM t_worktime;

문제2
T_WORKTIME테이블의 작업시간 누적 합계를 구하자.

SELECT
       a.workcd_vc
      ,a.time_nu
      ,SUM(b.time_nu) sum_time
  FROM (
        SELECT seq_vc,workcd_vc,time_nu,rownum num FROM t_worktime
       )A,
       (
        SELECT seq_vc,workcd_vc,time_nu,rownum num FROM t_worktime
       )B
 WHERE A.num <= B.num
GROUP BY A.seq_vc,A.workcd_vc,A.time_nu
ORDER BY sum_time;

SUM() OVER()라는 함수를 이용하면

SELECT workcd_vc
      ,time_nu
      ,SUM(time_nu) OVER(ORDER BY seq_vc) AS "SUM_TIME"
  FROM t_worktime
0 Comments
댓글쓰기 폼