복붙노트

[SQL] 하나를 제외한 모든 중복 레코드를 삭제

SQL

하나를 제외한 모든 중복 레코드를 삭제

나는 주어진 프로파일 (사용자 ID 쌍에 대한 사용자 ID) 방문객의 추적을 유지하도록되어 테이블이있다. 그것은 내 SQL 쿼리가 조금 벗어났다 밝혀 의도 한대로 대신 한 사람의 여러 쌍을 생산하고있다. 돌이켜 보면 나는 각각의 아이디 + 아이디 쌍에 고유 제한 조건을 적용해야합니다.

자, 어떻게 테이블까지 청소에 대해 갈 수 있을까? 내가하고 싶은 모든 중복 쌍을 삭제하고 하나를두고있다.

그래서 예를 들어이 값을 변경 :

23515 -> 52525 date_visited
23515 -> 52525 date_visited
23515 -> 52525 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
23515 -> 52525 date_visited
...

이 속으로 :

23515 -> 52525 date_visited
12345 -> 54321 date_visited

업데이트 : 여기에 요청에 따라 테이블 구조는 다음과 같습니다

id  int(10)         UNSIGNED    Non     Aucun   AUTO_INCREMENT
profile_id  int(10)         UNSIGNED    Non     0 
visitor_id  int(10)         UNSIGNED    Non     0
date_visited    timestamp           Non     CURRENT_TIMESTAMP   

해결법

  1. ==============================

    1.ANSI는 솔루션을 뿌렸다

    ANSI는 솔루션을 뿌렸다

    하위 쿼리에 의해 그룹을 사용 :

    delete from my_tab where id not in 
    (select min(id) from my_tab group by profile_id, visitor_id);
    

    당신은 고유 식별자 (여기, 내가 ID를 사용하고 있습니다)의 일종이 필요합니다.

    MySQL의 솔루션

    @JamesPoulson에 의해 지적이는 MySQL의에 구문 오류가 발생합니다; (제임스의 대답에서와 같이) 올바른 솔루션입니다 :

    delete from `my_tab` where id not in
    ( SELECT * FROM 
        (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
    );
    
  2. ==============================

    2.다음은 MySQL을 작업에 자신의 해결책을 허용하는 임시 테이블을 사용하는 작은 해결과 프랭크 슈미트의 솔루션입니다 :

    다음은 MySQL을 작업에 자신의 해결책을 허용하는 임시 테이블을 사용하는 작은 해결과 프랭크 슈미트의 솔루션입니다 :

    delete from `my_tab` where id not in
    ( SELECT * FROM 
        (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
    )
    
  3. ==============================

    3.이것은 작동합니다 :

    이것은 작동합니다 :

    With NewCTE
    AS
    (
    Select *, Row_number() over(partition by ID order by ID)as RowNumber from 
    table_name
    )
    Delete from NewCTE where RowNumber > 1
    
  4. ==============================

    4.모든 고유 행을 선택 새로운 임시 테이블로 복사 자르기 원래 테이블 원래 테이블에 복사 임시 테이블 데이터 그게 내가 할 일이야. 당신을 위해 모든 것을 할 것 1 개 쿼리 거기에 있는지 확실하지 않습니다.

    모든 고유 행을 선택 새로운 임시 테이블로 복사 자르기 원래 테이블 원래 테이블에 복사 임시 테이블 데이터 그게 내가 할 일이야. 당신을 위해 모든 것을 할 것 1 개 쿼리 거기에 있는지 확실하지 않습니다.

  5. ==============================

    5.당신은 SQL을 사용하는 경우에는 수동으로 만이 절차를 수행 한 항목을 유지 중복 행을 삭제할 수 있습니다 :

    당신은 SQL을 사용하는 경우에는 수동으로 만이 절차를 수행 한 항목을 유지 중복 행을 삭제할 수 있습니다 :

    그것은 긴 과정이다 그러나 당신은 실시간으로 즉시 결과를 볼 수 있습니다.

    당신을 위해 일이 솔루션을 희망!

  6. from https://stackoverflow.com/questions/5882649/delete-all-but-one-duplicate-record by cc-by-sa and MIT license