[DataLemur] Duplicate Job Listings

다람·2일 전

DataLemur

목록 보기
1/2
post-thumbnail

1. 문제 이해

이 문제는 단순히 중복 데이터를 찾는 것이 아니라,
중복된 채용 공고를 올린 회사 수(company_id 기준) 를 구하는 문제이다.

중복의 정의는 다음과 같다.

  • 같은 company_id
  • 같은 title
  • 같은 description

이 세 가지가 모두 동일한 경우를 중복으로 본다.

2. 처음 접근 방법

처음에는 다음과 같은 방식으로 문제를 해결했다.

select count(cnt) as duplicate_companies
from
  (
    SELECT count(company_id) as cnt, title, description 
    FROM job_listings
    group by company_id, title, description
  ) a
where cnt > 1;

접근 의도

  • company_id, title, description으로 그룹핑
  • count를 통해 중복 여부 확인
  • cnt > 1이면 중복 데이터라고 판단
  • 마지막에 count(cnt)로 개수 집계

이 접근 자체는 중복을 찾는 방식으로는 올바른 방향이겠지만 최종적으로는 접근 방법이 틀렸다.

3. 문제점

문제는 마지막 집계 부분이였다.

count(cnt)

이 쿼리는 다음을 의미한다.

  • 중복된 (company_id, title, description) 조합의 개수

하지만 문제에서 요구하는 것은

  • 중복을 가진 회사의 개수이다.

즉, 집계 대상이 다르다는 점이다. 문제는 통과했지만 테스트케이스가 많이 존재 했다면 실패했을 것이다.

4. 왜 틀렸는지 이해하기

다음과 같은 데이터가 있다고 가정했을 때

company_idtitledescriptioncount
1AX2
1BY2

이 경우는

  • 회사 1이 중복 공고를 2개 가지고 있는 경우이다.

기존 쿼리 결과

count(cnt) = 2

중복 건수 기준으로 계산될 것이다.

실제 정답

COUNT(DISTINCT company_id) = 1

실제로는 회사 수 기준으로 계산되어야 하기 때문에 1이라는 값이 계산될 것이다.

5. 핵심 개념 정리

이 문제에서 가장 중요한 포인트는 다음이다.

중간 결과는 "중복된 공고 목록"이다.
하지만 최종 결과는 "그 공고를 가진 회사 수"이다.

즉,

  • 행(row)을 세는 것이 아니고
  • 회사(company_id)를 세야 한다.

6. 수정 쿼리

최종적으로 아래와 같이 수정하였다.

select count(DISTINCT company_id) as duplicate_companies
from
  (
    SELECT count(*), company_id, title, description 
    FROM job_listings
    GROUP BY company_id, title, description
    HAVING count(*) > 1
  ) a;

7. 쿼리 흐름 설명

1단계: 그룹핑

GROUP BY company_id, title, description
  • 동일한 공고 단위로 묶었다.

2단계: 중복 필터링

HAVING count(*) > 1
  • 같은 공고가 2개 이상인 경우만 남길 수 있도록 조건을 줬다.

3단계: 회사 기준으로 집계

COUNT(DISTINCT company_id)
  • 같은 회사가 여러 번 등장할 수 있기 때문에 중복을 제거하고
  • 최종적으로 회사 수만 계산한다.

8. 헷갈렸던 부분 정리

1. COUNT의 대상

  • COUNT(*) -> 행 개수
  • COUNT(column) -> 값 개수
  • COUNT(DISTINCT column) -> 중복 제거된 개수

문제에서는 "회사 수"를 구해야 했기 때문에 DISTINCT가 필요했다.

2. 중간 결과와 최종 결과의 차이

  • 중복된 공고 목록

  • 중복 공고를 가진 회사 수

이 두 개를 혼동하면서 문제가 발생했다.

3. GROUP BY 이후 무엇을 세는지

GROUP BY를 사용하면 데이터가 "그룹 단위"로 바뀐다.

하지만 이후 COUNT를 할 때

  • 그룹 개수를 셀 것인지
  • 특정 컬럼 기준으로 셀 것인지

이 부분을 반드시 구분해야 될 것 같다.

9. 패턴 정리

이 문제는 다음 패턴으로 정리할 수 있다.

GROUP BY A, B, C
HAVING COUNT(*) > 1
-> DISTINCT A
-> COUNT
profile
개발하는 다람쥐

0개의 댓글