1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | --최초 1건 WITH T(id, prj_id, name , period, amount) AS ( SELECT '1' , '10' , 'A' , '2013-01' , '100' FROM DUAL UNION ALL SELECT '2' , '10' , 'A' , '2013-02' , '100.1' FROM DUAL UNION ALL SELECT '3' , '10' , 'A' , '2013-02' , '100' FROM DUAL UNION ALL SELECT '4' , '10' , 'A' , '2013-03' , '100' FROM DUAL UNION ALL SELECT '5' , '10' , 'A' , '2013-03' , '100.3' FROM DUAL UNION ALL SELECT '6' , '10' , 'A' , '2013-03' , '99.89' FROM DUAL ) SELECT id, period, amount FROM ( SELECT id, period, amount, ROW_NUMBER() OVER(PARTITION BY name , period ORDER BY id) AS rno FROM T ) WHERE rno = 1 ; --100 값을 가진 최초 1건, 100인 것이 없을 경우 최초 1건 WITH T(id, prj_id, name , period, amount) AS ( SELECT '1' , '10' , 'A' , '2013-01' , '100' FROM DUAL UNION ALL SELECT '2' , '10' , 'A' , '2013-02' , '100.1' FROM DUAL UNION ALL SELECT '3' , '10' , 'A' , '2013-02' , '100' FROM DUAL UNION ALL SELECT '4' , '10' , 'A' , '2013-03' , '100' FROM DUAL UNION ALL SELECT '5' , '10' , 'A' , '2013-03' , '100.3' FROM DUAL UNION ALL SELECT '6' , '10' , 'A' , '2013-03' , '99.89' FROM DUAL ) SELECT id, period, amount FROM ( SELECT id, period, amount, ROW_NUMBER() OVER(PARTITION BY name , period ORDER BY DECODE(amount, '100' , 1, id)) AS rno FROM T ) WHERE rno = 1 |
1 2 3 4 5 6 7 8 9 10 11 12 | -- 우선 빈이님 말대로 = 100 조건을 주고 조회한 값이 정상적으로 나온다면? -- 나머지 데이터들을 != 100 조건 주고 지우시면 됩니다. -- 꼭 100 이 아니라 최초로 입력된 자료만 남기고자 한다면? DELETE FROM t a WHERE id > ( SELECT MIN (id) FROM t WHERE prj_id = a.prj_id AND period = a.period ) ; -- 그러나 이 쿼리를 사용하기 위해서는 반드시 다음 인덱스가 있어야 합니다. -- (prj_id, period, id) 없을 경우 이거라도 (prj_id, period) |