고유 사용자에 대한 보고서는 분석 및 통계에 필요합니다. 그러나 실제 데이터에서는 종종 계정 중복, 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;
주요 특징:
COUNT(DISTINCT ...)는 NULL이 있는 행을 고려하나요?
아니요: DISTINCT 목록의 열 중 하나라도 NULL 값을 가지면 해당 조합은 별도의 고유한 것으로 간주됩니다(SQL 표준에 따라 NULL은 NULL과 같지 않습니다). 일반적으로 NULL을 미리 필터링하여 제거하는 것이 더 편리합니다.
DISTINCT를 통해 NULL과 NULL을 비교할 수 있나요?
SQL에서 각 쌍의 NULL 값은 서로 다르게 간주되므로, 각 열의 NULL 값이 있는 행은 별개의 것으로 간주됩니다. IS NOT NULL 필터링을 적용해야 합니다.
GROUP BY는 항상 DISTINCT와 동일한 결과를 제공하나요?
아니요: GROUP BY는 각 반복되지 않는 값 조합에 대해 하나의 행을 생성하는 반면, DISTINCT는 단순히 중복을 제거합니다. 집계가 적용될 경우 결과가 다를 수 있습니다.
비즈니스 분석가는 COUNT(DISTINCT user_id)를 통해 고유 고객 보고서를 생성하지만, 실제로 user_id는 NULL이거나 중복될 수 있습니다(예: 일시적인 계정). 실제 사용자 수는 더 많아져 보고서의 지표가 왜곡됩니다.
장점:
단점:
분석가는 데이터를 미리 정리하고, NULL 및 명백한 중복을 서브쿼리에서 필터링하며, 고유 기준에 대한 복잡한 기준을 위해 SET 연산을 사용합니다.
장점:
단점: