Oracle 분석 함수 총화 (1) - 기본 개념 과 문법

Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group. The group of rows is called a window and is defined by the analytic_clause. For each row, a sliding window of rows is defined. The window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a physical number of rows or a logical interval such as time.
Analytic functions are the last set of operations performed in a query except for the final ORDER BY clause. All joins and all WHERE, GROUP BY, and HAVING clauses are completed before the analytic functions are processed. Therefore, analytic functions can appear only in the select list or ORDER BY clause.
분석 함 수 는 한 줄 집합 을 바탕 으로 집합 값 을 계산 하 는데 집합 함수 와 다른 점 은 분석 함수 가 여러 줄 로 돌아 가 는 것 이다.
(많은 분석 함수 도 집합 함수 로 사용 할 수 있 지만 두 가지 용법 은 문법 적 으로 차이 가 있 을 뿐이다)
줄 집합 은 창 이 라 고 불 리 며 줄 마다 미끄럼 창 을 정의 합 니 다.이 창 은 현재 줄 에 대해 계산 할 줄 의 범 위 를 결정 합 니 다.
창의 크기 는 물리 적 (줄 번호) 일 수도 있 고 논리 적 (값 범위) 일 수도 있 습 니 다.
마지막 order by 자 구 를 제외 하고 분석 함 수 는 검색 에서 마지막 으로 실 행 된 작업 입 니 다.
모든 join, where, group by, having 문 구 는 함 수 를 분석 하기 전에 실 행 됩 니 다.
따라서 분석 함 수 는 selection 구문 이나 order by 자구 에 만 나타 날 수 있 습 니 다.
분석 함수 문법 analyticfunction([arguments])
OVER(
[partition_clause]
[order_by_clause[windowing_clause]]
)
1) 분석 함 수 는 다음 과 같은 분석 함수 가 있 습 니 다. * 번 을 가 진 함 수 는 windowing 자 구 를 허용 합 니 다.
AVG *
CORR *
COUNT *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
FIRST
FIRST_VALUE *
LAG
LAST
LAST_VALUE *
LEAD
LISTAGG
MAX *
MIN *
NTH_VALUE*
NTILE
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
RANK
RATIO_TO_REPORT
REGR_ (Linear Regression) Functions *
ROW_NUMBER
STDDEV *
STDDEV_POP *
STDDEV_SAMP *
SUM *
VAR_POP *
VAR_SAMP *
VARIANCE *
2) PARTITION 자 구 는 표현 식 에 따라 그룹 을 나 누고 이 자 구 를 생략 하면 모든 결과 집합 이 하나의 그룹 으로 간주 된다.
3) ORDER BY 자구 ORDER BY 는 기본 WINDOWING 자 구 를 추가 합 니 다. 이 창 은 그룹의 첫 줄 부터 현재 줄 (값) 까지 계속 합 니 다.
즉, 준비 및 고객 ROW 를 중단 하기 전에 RANGE.
ORDER BY 가 없 을 때 기본 창 은 그룹의 모든 줄 입 니 다.
4) WINDOWING 자구 정의 분석 함수 역할 의 줄 집합, 집합 중의 데 이 터 는 하나의 창 으로 볼 수 있다.
WINDOWING 자 구 를 사용 하려 면 ORDER BY 자 구 를 사용 해 야 합 니 다.
창 을 만 드 는 키워드 가 두 개 있 습 니 다: ROWS 와 RANGE.
ROWS 는 물리 적 창 (줄) 을 표시 합 니 다.RANGE 는 논리 창 을 표시 합 니 다.
BETWEEN... AND: 하나의 범 위 를 지정 합 니 다. 생략 하면 하나의 점 만 지정 합 니 다. 출발점 이 되 고 종점 은 현재 줄 입 니 다.
UNBOUNDED PRECEDING: 창 은 현재 그룹의 첫 줄 에서 시작 합 니 다.
UNBOUNDED FOLLOWING: 창 을 표시 합 니 다. 현재 그룹의 마지막 줄 에서 끝 납 니 다.
CURRENT ROW: 창 이 현재 줄 이나 현재 값 에서 시작 / 끝 났 음 을 나 타 냅 니 다.
value_expr PRECEDING/value_expr FOLLOWING: 물리 적 또는 논리 적 오프셋 을 지정 합 니 다.
다음은 몇 가지 예 를 통 해 이러한 개념 을 이해한다.emp 표 에는 다음 과 같은 데이터 가 있 습 니 다.
tony@ORCL1> select empno,ename,sal,deptno
  2  from emp order by deptno, sal;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7934 MILLER           1300         10
      7782 CLARK            2450         10
      7839 KING             5000         10
      7369 SMITH             800         20
      7876 ADAMS            1100         20
      7566 JONES            2975         20
      7788 SCOTT            3000         20
      7902 FORD             3000         20
      7900 JAMES             950         30
      7654 MARTIN           1250         30
      7521 WARD             1250         30
      7844 TURNER           1500         30
      7499 ALLEN            1600         30
      7698 BLAKE            2850         30

14 rows selected.

wmsys.wm_concat () 함 수 는 필드 를 합 쳐 여러 줄 의 한 열 데 이 터 를 한 줄 로 합 쳐 표시 할 수 있 습 니 다.예 를 들 어 이 함 수 를 이용 하여 한 부서 의 모든 이름 을 한 줄 에 표시 합 니 다.
tony@ORCL1> column emp_list format a40
tony@ORCL1> select deptno, wm_concat(ename) emp_list
  2  from emp group by deptno;

    DEPTNO EMP_LIST
---------- ----------------------------------------
        10 CLARK,MILLER,KING
        20 SMITH,FORD,ADAMS,SCOTT,JONES
        30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD

위의 예 에서 wmconcat () 는 취 합 함수 로 사용 되 며 분석 함수 로 서 의 결 과 를 살 펴 보 겠 습 니 다.취 합 함수 의 용법 과 달리 분석 함수 가 줄 마다 결 과 를 되 돌려 주 는 것 을 볼 수 있 습 니 다.
tony@ORCL1> select ename,deptno,
  2  wm_concat(ename) over (partition by deptno) emp_list
  3  from emp;

ENAME          DEPTNO EMP_LIST
---------- ---------- ----------------------------------------
CLARK              10 CLARK,KING,MILLER
KING               10 CLARK,KING,MILLER
MILLER             10 CLARK,KING,MILLER
JONES              20 JONES,FORD,ADAMS,SMITH,SCOTT
FORD               20 JONES,FORD,ADAMS,SMITH,SCOTT
ADAMS              20 JONES,FORD,ADAMS,SMITH,SCOTT
SMITH              20 JONES,FORD,ADAMS,SMITH,SCOTT
SCOTT              20 JONES,FORD,ADAMS,SMITH,SCOTT
WARD               30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN
TURNER             30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN
ALLEN              30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN
JAMES              30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN
BLAKE              30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN
MARTIN             30 WARD,TURNER,ALLEN,JAMES,BLAKE,MARTIN

14 rows selected.

위의 예 는 order by 자 구 를 추가 하지 않 았 습 니 다. 앞에서 말 했 듯 이 order by 자구 가 없 으 면 기본 창 은 그룹의 모든 줄 입 니 다.그래서 각 부서 에서 조 를 나 누 는 모든 사람의 이름 이 표 시 됩 니 다.다음은 order by 자 구 를 더 하면 어떻게 되 는 지 살 펴 보 겠 습 니 다.결과 가 재 미 있 는 이 유 는 앞에서 언급 한 order by 절 에 기본 창 을 추가 하기 때 문 입 니 다. RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 는 그룹의 첫 줄 부터 현재 줄 (값) 까지 계속 합 니 다.
tony@ORCL1> select ename,deptno,
  2  wm_concat(ename) over (partition by deptno order by ename) emp_list
  3  from emp;

ENAME          DEPTNO EMP_LIST
---------- ---------- ----------------------------------------
CLARK              10 CLARK
KING               10 CLARK,KING
MILLER             10 CLARK,KING,MILLER
ADAMS              20 ADAMS
FORD               20 ADAMS,FORD
JONES              20 ADAMS,FORD,JONES
SCOTT              20 ADAMS,FORD,JONES,SCOTT
SMITH              20 ADAMS,FORD,JONES,SCOTT,SMITH
ALLEN              30 ALLEN
BLAKE              30 ALLEN,BLAKE
JAMES              30 ALLEN,BLAKE,JAMES
MARTIN             30 ALLEN,BLAKE,JAMES,MARTIN
TURNER             30 ALLEN,BLAKE,JAMES,MARTIN,TURNER
WARD               30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

14 rows selected.

몇 가지 예 를 더 보 자.partition 자구 와 order by 자구 가 없습니다. 창 은 그룹의 모든 줄 입 니 다.
tony@ORCL1> column sal format $99999.99
tony@ORCL1> column avgsal format $99999.99
tony@ORCL1> column sumsal format $99999.99
tony@ORCL1> select ename, sal, sum(sal) over() sumsal from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
SMITH         $800.00  $29025.00
ALLEN        $1600.00  $29025.00
WARD         $1250.00  $29025.00
JONES        $2975.00  $29025.00
MARTIN       $1250.00  $29025.00
BLAKE        $2850.00  $29025.00
CLARK        $2450.00  $29025.00
SCOTT        $3000.00  $29025.00
KING         $5000.00  $29025.00
TURNER       $1500.00  $29025.00
ADAMS        $1100.00  $29025.00
JAMES         $950.00  $29025.00
FORD         $3000.00  $29025.00
MILLER       $1300.00  $29025.00

14 rows selected.

order by 자구 가 열 리 지 않 았 습 니 다. 창 은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 입 니 다. 즉, 그룹의 첫 줄 을 현재 줄 (값) 로 나 누 는 것 입 니 다.
tony@ORCL1> select ename, sal,
  2  sum(sal) over(order by ename) sumsal
  3  from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
ADAMS        $1100.00   $1100.00
ALLEN        $1600.00   $2700.00
BLAKE        $2850.00   $5550.00
CLARK        $2450.00   $8000.00
FORD         $3000.00  $11000.00
JAMES         $950.00  $11950.00
JONES        $2975.00  $14925.00
KING         $5000.00  $19925.00
MARTIN       $1250.00  $21175.00
MILLER       $1300.00  $22475.00
SCOTT        $3000.00  $25475.00
SMITH         $800.00  $26275.00
TURNER       $1500.00  $27775.00
WARD         $1250.00  $29025.00

14 rows selected.

order by 가 salary 를 지정 하면 결과 에서 같은 salary 값 의 줄 의 결 과 를 주의 하 십시오.기본 창 자구 인 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 는 논리 창, 즉 현재 값 과 같은 모든 줄 까지 의 첫 번 째 줄 이기 때 문 입 니 다.
tony@ORCL1> select ename, sal,
  2  sum(sal) over(order by sal) sumsal
  3  from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
SMITH         $800.00    $800.00
JAMES         $950.00   $1750.00
ADAMS        $1100.00   $2850.00
WARD         $1250.00   $5350.00
MARTIN       $1250.00   $5350.00
MILLER       $1300.00   $6650.00
TURNER       $1500.00   $8150.00
ALLEN        $1600.00   $9750.00
CLARK        $2450.00  $12200.00
BLAKE        $2850.00  $15050.00
JONES        $2975.00  $18025.00
SCOTT        $3000.00  $24025.00
FORD         $3000.00  $24025.00
KING         $5000.00  $29025.00

14 rows selected.

부문 별로 임금 총계 의 결 과 를 계산 하 다.
tony@ORCL1> select ename, sal, deptno,
  2  sum(sal) over(partition by deptno) sumsal
  3  from emp;

ENAME             SAL     DEPTNO     SUMSAL
---------- ---------- ---------- ----------
CLARK        $2450.00         10   $8750.00
KING         $5000.00         10   $8750.00
MILLER       $1300.00         10   $8750.00
JONES        $2975.00         20  $10875.00
FORD         $3000.00         20  $10875.00
ADAMS        $1100.00         20  $10875.00
SMITH         $800.00         20  $10875.00
SCOTT        $3000.00         20  $10875.00
WARD         $1250.00         30   $9400.00
TURNER       $1500.00         30   $9400.00
ALLEN        $1600.00         30   $9400.00
JAMES         $950.00         30   $9400.00
BLAKE        $2850.00         30   $9400.00
MARTIN       $1250.00         30   $9400.00

14 rows selected.

부문 별로 임금 총계 의 결 과 를 계산 하 다.order by 자구 가 있 기 때문에 기본 창 자구 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 가 추가 되 었 습 니 다.
tony@ORCL1> select ename, sal, deptno,
  2  sum(sal) over(partition by deptno order by ename) sumsal
  3  from emp;

ENAME             SAL     DEPTNO     SUMSAL
---------- ---------- ---------- ----------
CLARK        $2450.00         10   $2450.00
KING         $5000.00         10   $7450.00
MILLER       $1300.00         10   $8750.00
ADAMS        $1100.00         20   $1100.00
FORD         $3000.00         20   $4100.00
JONES        $2975.00         20   $7075.00
SCOTT        $3000.00         20  $10075.00
SMITH         $800.00         20  $10875.00
ALLEN        $1600.00         30   $1600.00
BLAKE        $2850.00         30   $4450.00
JAMES         $950.00         30   $5400.00
MARTIN       $1250.00         30   $6650.00
TURNER       $1500.00         30   $8150.00
WARD         $1250.00         30   $9400.00

14 rows selected.

각 부문의 급여 평균 치 를 계산 하 다.
tony@ORCL1> select ename, sal, deptno,
  2  avg(sal) over(partition by deptno) avgsal
  3  from emp;

ENAME             SAL     DEPTNO     AVGSAL
---------- ---------- ---------- ----------
CLARK        $2450.00         10   $2916.67
KING         $5000.00         10   $2916.67
MILLER       $1300.00         10   $2916.67
JONES        $2975.00         20   $2175.00
FORD         $3000.00         20   $2175.00
ADAMS        $1100.00         20   $2175.00
SMITH         $800.00         20   $2175.00
SCOTT        $3000.00         20   $2175.00
WARD         $1250.00         30   $1566.67
TURNER       $1500.00         30   $1566.67
ALLEN        $1600.00         30   $1566.67
JAMES         $950.00         30   $1566.67
BLAKE        $2850.00         30   $1566.67
MARTIN       $1250.00         30   $1566.67

14 rows selected.

다음은 창문 을 여 는 예 를 몇 개 더 보 겠 습 니 다.이름 순 으로 앞의 세 줄 과 본 은행 의 월급 총 계 를 계산한다.
tony@ORCL1> select ename, sal,
  2  sum(sal) over(order by ename rows 3 preceding) sumsal
  3  from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
ADAMS        $1100.00   $1100.00
ALLEN        $1600.00   $2700.00
BLAKE        $2850.00   $5550.00
CLARK        $2450.00   $8000.00
FORD         $3000.00   $9900.00
JAMES         $950.00   $9250.00
JONES        $2975.00   $9375.00
KING         $5000.00  $11925.00
MARTIN       $1250.00  $10175.00
MILLER       $1300.00  $10525.00
SCOTT        $3000.00  $10550.00
SMITH         $800.00   $6350.00
TURNER       $1500.00   $6600.00
WARD         $1250.00   $6550.00

14 rows selected.

새 물 순위 에 따라 계산 > = (자기 월급 - 100) and & & & lt; 자신의 월급 의 모든 사람의 월급 총계
tony@ORCL1> select ename, sal,
  2  sum(sal) over(order by sal range 100 preceding) sumsal
  3  from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
SMITH         $800.00    $800.00
JAMES         $950.00    $950.00
ADAMS        $1100.00   $1100.00
WARD         $1250.00   $2500.00
MARTIN       $1250.00   $2500.00
MILLER       $1300.00   $3800.00
TURNER       $1500.00   $1500.00
ALLEN        $1600.00   $3100.00
CLARK        $2450.00   $2450.00
BLAKE        $2850.00   $2850.00
JONES        $2975.00   $2975.00
SCOTT        $3000.00   $8975.00
FORD         $3000.00   $8975.00
KING         $5000.00   $5000.00

14 rows selected.

새 물 순위 에 따라 계산 > = (자신의 월급 - 100) and < = (자신의 월급 + 200) 의 모든 사람의 월급 총계
tony@ORCL1> select ename, sal,
  2  sum(sal) over(order by sal range
  3    between 100 preceding and 200 following) sumsal
  4  from emp;

ENAME             SAL     SUMSAL
---------- ---------- ----------
SMITH         $800.00   $1750.00
JAMES         $950.00   $2050.00
ADAMS        $1100.00   $4900.00
WARD         $1250.00   $3800.00
MARTIN       $1250.00   $3800.00
MILLER       $1300.00   $5300.00
TURNER       $1500.00   $3100.00
ALLEN        $1600.00   $3100.00
CLARK        $2450.00   $2450.00
BLAKE        $2850.00  $11825.00
JONES        $2975.00   $8975.00
SCOTT        $3000.00   $8975.00
FORD         $3000.00   $8975.00
KING         $5000.00   $5000.00

14 rows selected.

좋은 웹페이지 즐겨찾기