Rapporten over unieke gebruikers zijn noodzakelijk voor analyse en statistiek. Echter, in echte gegevens komen vaak duplicaten van accounts voor, NULL-waarden (bijvoorbeeld niet opgegeven e-mailadres), en het is nodig om verschillende criteria in overweging te nemen (bijvoorbeeld uniciteit op basis van naam, e-mail, ip, en soms hun combinaties).
Een typische fout is om COUNT(DISTINCT user_id) te tellen zonder rekening te houden met de NULL of onduidelijke duplicaten in de vereiste kolommen (bijvoorbeeld één persoon met verschillende e-mails, of meerdere rijen met dezelfde user_id en verschillende statussen). Complexe queries met GROUP BY kunnen onjuiste resultaten opleveren als de logica van uniciteit niet goed is doordacht.
Het is belangrijk om de constructies DISTINCT, GROUP BY en filtering van NULL te combineren. Soms is het nodig om de gegevens vooraf te bereiden in een CTE of geneste subquery, gegroepeerd op de vereiste combinatie van kenmerken.
Voorbeeldcode:
-- Tellen van unieke gebruikers op basis van e-mail en ip, waarbij NULL wordt genegeerd 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;
Belangrijke kenmerken:
Telt COUNT(DISTINCT ...) rijen met NULL?
Nee: als een van de kolommen in de DISTINCT-lijst een waarde NULL heeft, wordt die combinatie als een aparte unieke geteld (NULL is niet gelijk aan NULL volgens de SQL-standaard). Gewoonlijk is het handiger om eerst NULL te verwijderen door te filteren.
Is het mogelijk om NULL met NULL te vergelijken via DISTINCT?
In SQL wordt elk paar NULL-waarden als verschillend beschouwd, waardoor elke rij met NULL in een van de kolommen als apart wordt geteld. Filteren via IS NOT NULL is noodzakelijk.
Geeft GROUP BY altijd hetzelfde resultaat als DISTINCT?
Nee: GROUP BY creëert één rij voor elke unieke combinatie van waarden, terwijl DISTINCT gewoon duplicaten verwijdert. In sommige gevallen is het resultaat verschillend, vooral als aggregatie wordt toegepast.
Een business analyst maakt een rapport over unieke klanten via COUNT(DISTINCT user_id), terwijl user_id in werkelijkheid NULL kan zijn of gedupliceerd (bijvoorbeeld tijdelijke accounts). Het werkelijke aantal gebruikers blijkt groter te zijn dan het werkelijke aantal — verstoorde cijfers in het rapport.
Voordelen:
Nadelen:
De analyst maakt de gegevens eerst schoon, filtert NULL en duidelijke duplicaten in subqueries, en gebruikt ook SET-operaties voor complexe uniciteitscriteria.
Voordelen:
Nadelen: