'RANK'에 해당되는 글 3건

  1. 2014.07.24 중복삭제하기
  2. 2012.09.17 오라클 분석함수 rank(), max(), sum()
  3. 2004.10.15 중복된 RECORD 삭제 방법
posted by 구름너머 2014. 7. 24. 10:37

Oracle Technical Bulletins No. 10185 참고..

중복된 RECORD 삭제 방법
================================

중복된 RECORD를 삭제하는 방법은 2가지가 있습니다.


방법1)

SQL> CREATE TABLE emp2 AS SELECT distinct * FROM emp;

SQL> DROP TABLE emp;

SQL> RENAME emp2 TO emp;




방법2) 중복된 데이터중에서 ROWID가 큰 값을 제거


SQL> DELETE FROM emp a
WHERE rowid > (SELECT MIN(ROWID)
FROM emp b
WHERE b.empno = a.empno);



en-core에서 본 白面書生(www.okjsp.pe.kr)님의 글도 참고해서 넣었습니다.

방법3) 나중에 들어온 데이터를 살릴경우


SQL> DELETE FROM emp a
WHERE ROWID < (SELECT MAX(ROWID)
FROM emp b
WHERE a.empno = b.empno);

방법4) 레코드가 완전 중복이 아니고 일부 중복인 데이터를 삭제할 경우


SQL>
DELETE /*+ FULL(A) PARALLEL(A, 7)  */
FROM TB_TEST PARTITION(P201407) A
WHERE ROWID IN ( SELECT RID
                            FROM ( SELECT ROWID AS RID, AREA_NO, KUK_NO, SUB_NO,
                                                     RANK() OVER (PARTITION BY AREA_NO, KUK_NO, SUB_NO ORDER BY START_DATE DESC) AS R_NO
                                        FROM TB_TEST PARTITION(P201407) B
                                        WHERE END_DATE = '99991231'
                                        AND     START_DATE < '20140701'
                                       )
                            WHERE R_NO <> 1

                           )
;

설명: 테이블 TB_TEST에서 AREA_NO, KUK_NO, SUB_NO, END_DATE 가 동일하고
        START_DATE가 7월이전인 자료 중에서 START_DATE가 OLD인 자료를 삭제한다.

       즉, AREA_NO, KUK_NO, SUB_NO, END_DATE는 같으나 START_DATE가 다른 자료를 삭제하되   최그것을 살리고 이전것을 삭제하는 경우입니다.

'ORACLE' 카테고리의 다른 글

오라클 파라메터 조회  (0) 2013.12.28
rawtohex 와 chr 사용  (0) 2013.12.20
connect by [Oracle 9i 에서 10g CONNECT_BY_ROOT 써먹기]  (0) 2013.04.04
LTRIM의 재발견  (0) 2013.04.04
28일 수업  (0) 2013.03.28
posted by 구름너머 2012. 9. 17. 15:32

분석함수

함수이름(인자) over (partition by ~ order by ~ rows)
0개~3개 1 2 3
2 : 함수에따라 필수사용인경우있음
3 : 단독사용x 사용시 2번 지정

-------------------------------------

SELECT ename, deptno, sal
, rank() over (order by sal desc) 순위
, RANK() OVER (PARTITION BY deptno ORDER BY sal desc) 부서내순위
, DENSE_RANK() OVER (ORDER BY sal desc) 순위2
FROM EMP;
ORDER BY deptno;


RANK 공동등수가있을경우 다음등수는 공동등수인원수를 따로 적용한 등수가 적용
DENSE_RANK 공동등수가있을경우 다음등수가 순차적으로 적용

1. 집계함수로 사용된 max 쿼리오류
SELECT ename, sal, MAX(sal) FROM EMP;

2. 분석함수로 사용된 max 쿼리실행
SELECT ename, sal, MAX(sal) OVER () FROM EMP;

3. PARTITION BY 옵션의 의미(group by 와 비슷)
SELECT ename,sal,deptno, MAX(sal) OVER() 전체최대
, MAX(sal) OVER(PARTITION BY deptno) 부서최대
FROM EMP;

4. 사원이름, 급여, 각부서의 급여합계표시
SELECT ename, sal, SUM(sal) OVER (PARTITION BY deptno)
FROM EMP;

5. 해당 행의 앞1 뒤1 컬럼값의 합
SELECT ename,sal
, SUM(sal) OVER(ORDER BY sal ROWS BETWEEN 1 preceding AND 1 following) 부분합
FROM EMP;

6. 누적합
SELECT ename, sal
, SUM(sal) OVER(ORDER BY sal ROWS unbounded preceding) 누적합
FROM EMP;

파트별 누적합
SELECT ename, sal
, SUM(sal) OVER(ORDER BY sal ROWS unbounded preceding) 누적합
FROM EMP;

분석함수 특징 : 분석함수를 제외한 SELECT 문부터 수행한후
해당결과를 대상으로 분석함수 적용함.
ORDER BY 절의 제외하고는 제일마지막에 수행함.
(분석함수를 조건절에 사용못함)

---------------------------------------------------

분석함수중 현재 data기준 앞줄이나 뒷줄data를 가져올수있음

LEAD : 현제 행의 다음레코드값을 가져올때
SELECT ename, sal, LEAD(sal,1) OVER(ORDER BY sal) FROM EMP;

LAG : 현제 행의 앞레코드값을 가져올때
SELECT ename, sal, LAG(sal,1) OVER(ORDER BY sal) FROM EMP;

[출처] 오라클 분석함수 rank(), max(), sum()|작성자 쫑이

 

 

 

참고1.조건에따른 누적합계 구하기 ==> http://www.oracleclub.com/lecture/2203

 

참고2.오라클 분석함수 사용예 및 정리된곳 ==>

http://www.java2s.com/Code/Oracle/Analytical-Functions/CatalogAnalytical-Functions.htm

 

posted by 구름너머 2004. 10. 15. 09:48

Oracle Technical Bulletins No. 10185 참고..

중복된 RECORD 삭제 방법
================================

중복된 RECORD를 삭제하는 방법은 2가지가 있습니다.


방법1)

SQL> CREATE TABLE emp2 AS SELECT distinct * FROM emp;

SQL> DROP TABLE emp;

SQL> RENAME emp2 TO emp;




방법2) 중복된 데이터중에서 ROWID가 큰 값을 제거


SQL> DELETE FROM emp a
WHERE rowid > (SELECT MIN(ROWID)
FROM emp b
WHERE b.empno = a.empno);



en-core에서 본 白面書生(www.okjsp.pe.kr)님의 글도 참고해서 넣었습니다.

방법3) 나중에 들어온 데이터를 살릴경우


SQL> DELETE FROM emp a
WHERE ROWID < (SELECT MAX(ROWID)
FROM emp b
WHERE a.empno = b.empno);

방법4) 레코드가 완전 중복이 아니고 일부 중복인 데이터를 삭제할 경우


SQL>
DELETE /*+ FULL(A) PARALLEL(A, 7)  */
FROM TB_TEST PARTITION(P201407) A
WHERE ROWID IN ( SELECT RID
                            FROM ( SELECT ROWID AS RID, AREA_NO, KUK_NO, SUB_NO,
                                                     RANK() OVER (PARTITION BY AREA_NO, KUK_NO, SUB_NO ORDER BY START_DATE DESC) AS R_NO
                                        FROM TB_TEST PARTITION(P201407) B
                                        WHERE END_DATE = '99991231'
                                        AND     START_DATE < '20140701'
                                       )
                            WHERE R_NO <> 1

                           )
;

설명: 테이블 TB_TEST에서 AREA_NO, KUK_NO, SUB_NO, END_DATE 가 동일하고
        START_DATE가 7월이전인 자료 중에서 START_DATE가 OLD인 자료를 삭제한다.

       즉, AREA_NO, KUK_NO, SUB_NO, END_DATE는 같으나 START_DATE가 다른 자료를 삭제하되   최그것을 살리고 이전것을 삭제하는 경우입니다.