2009-07-23 8 views
10

일부 행이있는 표가 있습니다. 모든 행에는 날짜 필드가 있습니다. 지금은 날짜의 중복 일 수 있습니다. 모든 중복을 삭제하고 가장 높은 행만 저장해야합니다. id. SQL 쿼리를 사용하면 어떻게 가능합니까? 이제SQL로 중복 행을 삭제하는 방법은 무엇입니까?

는 :

date  id 
'07/07' 1 
'07/07' 2 
'07/07' 3 
'07/05' 4 
'07/05' 5 

내가 원하는 것은 : MySQL은, PostgreSQL을, 오라클 더 나은 방법을

date  id 
'07/07' 3 
'07/05' 5 
+0

보낸 데이터에서 3 행이 아니라 2 행으로 끝납니다! 07/05가 반복됩니다. – notnoop

답변

33
DELETE FROM table WHERE id NOT IN 
    (SELECT MAX(id) FROM table GROUP BY date); 
+0

와우, 나는 로터리 방식으로 갔습니까? 이것은 확실히 이것을하는 가장 좋은 방법입니다. – Eric

+0

나는 당신의 생각이 너무 복잡하다고 생각했습니다 ...하지만 솔직히, 나는 이것 대신에 3 가지 질의를 먼저 사용하고 싶었습니다. –

+4

이 쿼리는이 대답에 유용 : 날짜함으로써 테이블 그룹에서 NumOccurrences AS SELECT 날짜, COUNT (날짜) (COUNT (일)> 1) – djangofan

2

이 가입 SELF입니다.

Postgresql: 
DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id; 

MySQL   
DELETE FROM table 
USING table, table as vtable 
WHERE (table.id < vtable.id) 
AND (table.date=vtable.date) 

SQL aggregate (max, group by) 기능은 거의 항상 매우 느립니다.

6

내가 지금 여기의 경우 사람의 답변으로 내 댓글의 동일한 문제에 걸쳐 제공, 코멘트 권한이 없습니다 : sqlite3를에서

, "ROWID"라는 암시 숫자 기본 키, 그래서 같은 존재 쿼리는 다음과 같이 보입니다.

DELETE FROM table WHERE rowid NOT IN 
(SELECT MAX(rowid) FROM table GROUP BY date); 

"id"라는 기본 키 열이 없더라도이 테이블은 모든 테이블에서 작동합니다.

관련 문제