Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 196

196. Delete Duplicate Emails


문제

  • 중복되는 이메일 삭제
  • 이메일이 처음 만들어진 아이디는 남긴다.
문제 접근

  • delete from을 이용하여 삭제 처리
  • delete from where subquery 사용 시 하위 쿼리를 한번 더 사용해주어야 한다.
  • row_number를 활용하여 1번을 제외한 아이디를 모두 가져와 삭제

  • 속도 측면에서는 하나의 테이블을 조회하면 삭제 처리가 가능하여 빠르다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    delete from Person
    where id in (
      select id
      from (
          select
              id,
              row_number() over(partition by email order by id) rn
          from Person
      ) x
      where rn <> 1
      )
    

다른 사람들의 코드 리뷰

  • product join을 활용한 삭제 처리
    • join을 활용하여 현재 자신과 이메일이 같으며, id가 큰 row를 모두 삭제
    • 직관적이나, 속도 측면에서 많이 느리다.
1
2
3
4
5
delete p1
from Person p1, Person p2
where 1=1
    and p1.email = p2.email
    and p1.id > p2.id
  • 서브 쿼리를 group by와 not in을 통하여 진행
  • 알기로는 in이 처리 시 속도가 조금더 빠른것으로 알고 있으나, group by를 통한 속도 향상 처리가 되어 해당 문제에서는 아래 쿼리가 조금 더 빠른것으로 판단
1
2
3
4
5
6
7
8
9
10
delete from Person
where id not in (
    select id
    from (
        select
            min(id) as id
        from Person
        group by email
    ) as x
)