database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40426 게시물 읽기
No. 40426
오라클 셀렉트쿼리에 관해서 질문있어요
작성자
도토리(dododori)
작성일
2014-04-09 18:15
조회수
7,238

 어제도 질문올렸는데 오늘도 또 올리게 되었네요..;; 제가 많이 부족하네요..

어제 올렸던 트리거랑 내용이 이어지는데요.. 이 테이블이 업데이트 트리거가 걸려있었죠. 근데 전 컬럼 업데이트가 다 걸려있다보니

히스토리에 쌓이는 데이터가 바뀐 내용도 없는데 중복으로 자꾸 쌓였죠.. 예를들면 바뀐 내용도 없는데 1일에도 업뎃되고 2일에도 업뎃되고..

이런식으로.. 중복데이터가 쌓이게 된거에요.. 그래서 USE컬럼이 바뀌었을때만 사용했다가 안했다가 이렇게 바뀔때만 업데이트 되도록 트리거를

수정을 했죠. 근데 이미 쌓인 데이터들때문에.. 예를들면 4월1일날에 업데이트가 되었는데 사용유무가 Y였다가 4월8일날 업데이트 되었는데 또 사용유무가 Y인거

반대로 N이었는데 N 인것들 (N -> Y, Y-> N 인것은 정상적인것이죠) 동일한 ID별로 ID가 1인데 1일에는 N 8일에는 N, ID가 2번인데 1일에는 Y 7일에는 N, ID가 3번인데 Y 에서 Y

이런식에 데이터가 있으면

1번, 4월1일, N

1번, 4월8일, N

3번, 4월1일, Y

3번, 4월7일, Y

이렇게 나왔으면 좋겠어요~ 다른 테이블이 아닌 한 테이블에서 이렇게 중복된 데이터를 컨트롤을 해야하는데 어떤방법을 사용하면 될까요?

몇천~몇만건의 잘못된 데이터를 골라내서삭제해야하거든요.

방법좀 부탁드리겠습니다.

이 글에 대한 댓글이 총 2건 있습니다.

WITH t AS
(
SELECT 1 id, '0401' dt, 'N' yn FROM dual
UNION ALL SELECT 1, '0408', 'N' FROM dual
UNION ALL SELECT 2, '0401', 'Y' FROM dual
UNION ALL SELECT 2, '0407', 'N' FROM dual
UNION ALL SELECT 3, '0401', 'Y' FROM dual
UNION ALL SELECT 3, '0407', 'Y' FROM dual
UNION ALL SELECT 3, '0409', 'N' FROM dual
UNION ALL SELECT 3, '0410', 'Y' FROM dual
)
SELECT *
  FROM (SELECT id, dt, yn
             , COUNT(*) OVER(PARTITION BY id, grp) cnt
             , ROW_NUMBER() OVER(PARTITION BY id, grp ORDER BY dt) rn
          FROM (SELECT id, dt, yn
                     , ROW_NUMBER() OVER(PARTITION BY id ORDER BY dt)
                     - ROW_NUMBER() OVER(PARTITION BY id, yn ORDER BY dt)
                    AS grp
                  FROM t
                )
        )
 WHERE cnt > 1
;

마농(manon94)님이 2014-04-16 15:46에 작성한 댓글입니다.

DELETE FROM t
 WHERE (id, dt)
    IN (-- 삭제대상만 조회 --
        SELECT id, dt
          FROM (SELECT id, dt, yn
                     , DECODE(LAG(yn) OVER(PARTITION BY id ORDER BY dt)
                       , yn, 0, 1) flag
                  FROM t
                )
         WHERE flag = 0
        )
;

마농(manon94)님이 2014-04-16 15:51에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40429[질문] 순차적으로 가로로 데이터를 추출한는 query 문의 드립니다. [13]
안동석
2014-04-14
8217
40428난이도 있는? 쿼리 질문입니다. [3]
착한넘
2014-04-10
8302
40427ORACLE 연결 Time out 문제 [1]
허양민
2014-04-10
6708
40426오라클 셀렉트쿼리에 관해서 질문있어요 [2]
도토리
2014-04-09
7238
40425오라클 커서 질문입니다.
서호현
2014-04-09
6509
40424금액 배분 관련 입니다. [1]
태지666
2014-04-09
9462
40423오라클 트리거에 관해서 질문드려요 [2]
도토리
2014-04-08
7221
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다