ProgrammatieBI/analist, Data Engineer

Hoe correct unieke gebruikers te tellen op basis van een complexe set criteria, rekening houdend met NULL en duplicaten, met behulp van DISTINCT, COUNT, GROUP BY in SQL?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Vraaggeschiedenis

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).

Probleem

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.

Oplossing

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:

  • DISTINCT houdt geen rekening met rijen met NULL in een van de vermelde kolommen
  • Voor kruis-groepering is het beter om GROUP BY te gebruiken op een combinatie van velden
  • Bij het werken met duplicaten moeten de gegevens vaak vooraf "schoongemaakt" worden

Vragen met een haakje.

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.

Typische fouten en anti-patronen

  • Onopvallende filtering van NULL-waarden
  • Impliciete duplicatie van gegevens vóór aggregatie
  • Onjuiste combinatie van DISTINCT met aggregatie op verschillende niveaus van hiërarchie

Voorbeeld uit het leven

Negatief geval

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:

  • Snelle implementatie van het rapport

Nadelen:

  • Onjuiste zakelijke beslissingen door een foute metric

Positief geval

De analyst maakt de gegevens eerst schoon, filtert NULL en duidelijke duplicaten in subqueries, en gebruikt ook SET-operaties voor complexe uniciteitscriteria.

Voordelen:

  • Correcte en transparante metrics
  • Geldige zakelijke beslissingen en KPI's

Nadelen:

  • Complexere query, vereist kwaliteitscontrole op testgegevens