--최초 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
-- 우선 빈이님 말대로 = 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)