프로그래밍BI/분석가, 데이터 엔지니어

복잡한 기준 집합에 따라 NULL 및 중복을 고려하여 SQL에서 DISTINCT, COUNT, GROUP BY 구문을 사용하여 고유 사용자 수를 올바르게 계산하는 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사

고유 사용자에 대한 보고서는 분석 및 통계에 필요합니다. 그러나 실제 데이터에서는 종종 계정 중복, NULL 값(예: 지정되지 않은 이메일)이 존재하며, 다양한 기준(예: 이름, 이메일, IP에 대한 고유성 또는 때로는 이들의 조합을 고려해야 합니다).

문제

일반적인 실수는 COUNT(DISTINCT user_id)를 계산할 때 필요한 열에 NULL 또는 명백하지 않은 중복(예: 서로 다른 이메일을 가진 동일한 사람이나 동일한 user_id와 다른 상태를 가진 여러 행이 있을 경우)을 고려하지 않는 것입니다. GROUP BY로 복잡한 쿼리를 실행하면 고유성 논리가 잘못되었을 경우 잘못된 결과를 반환할 수 있습니다.

해결책

DISTINCT, GROUP BY 및 NULL 필터링 구문을 결합하는 것이 중요합니다. 때때로 필요한 특성 집합에 따라 먼저 CTE 또는 서브쿼리에서 데이터를 준비해야 합니다.

코드 예시:

-- NULL을 무시하고 이메일 및 IP에 따른 고유 사용자 수 계산 SELECT COUNT(*) AS unique_users FROM ( SELECT DISTINCT email, ip_address FROM users WHERE email IS NOT NULL AND ip_address IS NOT NULL ) u;

주요 특징:

  • DISTINCT는 지정된 열 중 하나라도 NULL이 있는 행을 고려하지 않습니다.
  • 교차 그룹화를 위해서는 조합 필드에 대해 GROUP BY를 사용하는 것이 좋습니다.
  • 중복 작업 시 데이터를 종종 "정리"해야 합니다.

헷갈리는 질문들.

COUNT(DISTINCT ...)는 NULL이 있는 행을 고려하나요?

아니요: DISTINCT 목록의 열 중 하나라도 NULL 값을 가지면 해당 조합은 별도의 고유한 것으로 간주됩니다(SQL 표준에 따라 NULL은 NULL과 같지 않습니다). 일반적으로 NULL을 미리 필터링하여 제거하는 것이 더 편리합니다.


DISTINCT를 통해 NULL과 NULL을 비교할 수 있나요?

SQL에서 각 쌍의 NULL 값은 서로 다르게 간주되므로, 각 열의 NULL 값이 있는 행은 별개의 것으로 간주됩니다. IS NOT NULL 필터링을 적용해야 합니다.


GROUP BY는 항상 DISTINCT와 동일한 결과를 제공하나요?

아니요: GROUP BY는 각 반복되지 않는 값 조합에 대해 하나의 행을 생성하는 반면, DISTINCT는 단순히 중복을 제거합니다. 집계가 적용될 경우 결과가 다를 수 있습니다.

일반적인 실수 및 안티 패턴

  • NULL 값의 불명확한 필터링
  • 집계 전 데이터의 암묵적인 중복
  • 서로 다른 계층 수준에서의 DISTINCT와 집계의 부적절한 조합

실생활 사례

부정적인 경우

비즈니스 분석가는 COUNT(DISTINCT user_id)를 통해 고유 고객 보고서를 생성하지만, 실제로 user_id는 NULL이거나 중복될 수 있습니다(예: 일시적인 계정). 실제 사용자 수는 더 많아져 보고서의 지표가 왜곡됩니다.

장점:

  • 보고서 신속하게 구현

단점:

  • 잘못된 지표로 인한 부정확한 비즈니스 결정

긍정적인 경우

분석가는 데이터를 미리 정리하고, NULL 및 명백한 중복을 서브쿼리에서 필터링하며, 고유 기준에 대한 복잡한 기준을 위해 SET 연산을 사용합니다.

장점:

  • 정확하고 투명한 지표
  • 유효한 비즈니스 결정 및 KPI

단점:

  • 더 복잡한 쿼리 및 테스트 데이터 확인의 품질 요구 사항