○ Analytic Function
1. 정의
① 쿼리를 수행하는 구문 중에 가장 마지막에 실행된다. (order by 보다는 먼저 실행)
② 쿼리 구문을 수행하고 2차로 값을 가공한다.
2. 구문
select column_name, column_name over([partition by column_name], [order by column_nae, ... ]) from table; |
3. 누적합을 구하는 Analytic Function
select deptno, empno, ename, sal, sum(sal) over (partition by deptno order by sal) as dept_avg_sal : deptno별 누적 sal을 구하고 sal로 order by 하는데 같은 값의 row가 있으면 제대로 된 값이 안나올 수 있으므로 order에 구분할 컬럼을 더 해준다.
select deptno, empno, ename, sal, sum(sal) over (partition by deptno order by sal, deptno) as dept_avg_sal
|
4. rank를 구하는 Analytic Function
① rank() : 순서를 정하는데 같은 값은 똑같은 순서로 정하고, 다음 순번은 없앤다. (1,2,2,4)
② dense_rank() : 다음 순번을 없애니 않는다. (1,2,2,3)
③ row_number() : 같은 값이라도 위치나 이름에 따라 순번을 정한다. (1,2,3,4)
select deptno, empno, ename, sal, rank() over(order by sal) "Rank", >>
select deptno, empno, ename, sal, rank() over(partition by deptno >> |
5. Moving Aggregates
select empno, sal, avg(sal) over (order by sal, empno) as ret1, --- 누적된 row의 평균 --- 자신을 포함한 위의 2 row의 평균 avg(sal) over (order by sal, empno rows between current row and 2 fllowing) as ret3 -- 자신을 포함한 밑의 2 row의 평균 >>
|
6. LAG , LEAD
① 자신의 row를 기준으로 위와 아래의 row
② example
select empno, ename, sal, lag(sal, 1, 0) over (order by sal) as prevsal : 현재 row의 1칸 위의 sal, 처음의 row는 위에 값이 없을 때, null을 return하므로 숫자를 넣을 수 있다. select empno, ename, sal, lead(sal, 1, 0) over (order by sal) as prevsal from emp; : 현재 row의 1칸 밑의 sal, 마지막 row는 밑에 값이 없을 때, null을 return하므로 숫자를 넣을 수 있다. |
7. First Value , Last Value
① 조건의 처음의 값과 마지막 값을 return
② Last Value는 버그가 발생 이에 관한 자료 참고
http://blog.naver.com/gseducation?Redirect=Log&logNo=20095625332
- last_value 대신 first_value를 사용하여 last_value의 결과값을 구할 수 있다.
select deptno, empno, ename, first_value(sal) over(partition by deptno >>
select deptno, empno, ename, first_value(sal) over(partition by deptno : last_value대신 first_value에서 order by의 desc를 사용하여 구할 수 있다. >> |
[출처] : http://blog.naver.com/0moodgirl0?Redirect=Log&logNo=106361019
'DataBase > Sql' 카테고리의 다른 글
[Sql] NoSql (0) | 2012.01.04 |
---|---|
[Sql] Select시 데이터 가로로 출력! (0) | 2011.11.04 |
[Sql] 지운데이터 복구 (0) | 2011.10.14 |
[Sql] Oracle - sql정리_요약 (0) | 2011.08.11 |
[Sql] Oracle - MONTHS_BETWEEN 월단위 계산 (0) | 2011.07.28 |