ProgramlamaBI/analist, Veri Mühendisi

Bir SQL sorgusunda NULL ve tekrarları dikkate alarak karmaşık kriterler setine göre benzersiz kullanıcı sayısını doğru bir şekilde nasıl hesaplayabilirsiniz, DISTINCT, COUNT, GROUP BY yapıları kullanarak?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Soru geçmişi

Benzersiz kullanıcı raporları, analiz ve istatistik için gereklidir. Ancak gerçek verilere baktığımızda genellikle hesap dublike oluyor, NULL değerler (örneğin, belirtilmemiş e-posta) ve farklı kriterlerin dikkate alınması gerekiyor (örneğin, ad, e-posta, IP'ye göre benzersizlik veya bazen bunların kombinasyonları gibi).

Problem

Tipik bir hata, COUNT(DISTINCT user_id) kullanarak, gerekli sütunlarda NULL veya belirsiz tekrarların olduğunu dikkate almaksızın saymaktır (örneğin, bir kişinin farklı e-posta adresleri veya aynı user_id'ye sahip farklı statüde birden fazla satır). GROUP BY ile yapılan karmaşık sorgular, benzersizlik mantığı iyi düşünülmezse yanlış sonuçlar verebilir.

Çözüm

DISTINCT, GROUP BY ve NULL filtrelemelerini birleştirmek önemlidir. Bazen verileri önceden CTE veya alt sorgu içinde hazırlamak ve gerekli özellikler setine göre gruplaşmak gerekir.

Örnek kod:

-- NULL'ları göz ardı ederek e-posta ve IP'ye göre benzersiz kullanıcı sayımı 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;

Anahtar özellikler:

  • DISTINCT, belirtilen sütunlardan herhangi birinde NULL olan satırları dikkate almaz
  • Çapraz gruplama için, alanların kombinasyonuna göre GROUP BY kullanmak daha iyidir
  • Dublike verilerle çalışırken, verileri genellikle "temizlemek" gerekir.

Zorluk içeren sorular.

COUNT(DISTINCT ...) NULL olan satırları değerlendirir mi?

Hayır: Eğer DISTINCT listesindeki sütunlardan en az birinin değeri NULL ise, bu kombinasyon ayrı bir benzersiz olarak kabul edilir (NULL, SQL standardında NULL'e eşit değildir). Genellikle, öncelikle NULL'ları filtrelemek daha uygundur.


NULL'ı DISTINCT ile NULL ile karşılaştırmak mümkün mü?

SQL'de her NULL değer çifti farklı olarak sayılır, bu nedenle herhangi bir sütunda NULL olan her satır ayrı bir satır olarak kabul edilir. IS NOT NULL filtresi uygulanmalıdır.


GROUP BY her zaman DISTINCT ile aynı sonucu mu verir?

Hayır: GROUP BY, her tekrarlanmayan değer kombinasyonu için bir satır oluşturur, ancak DISTINCT sadece tekrarları kaldırır. Bazı durumlarda sonuçlar farklıdır, özellikle bir toplama uygulandığında.

Yaygın hatalar ve anti-paterner

  • Belirsiz NULL değer filtreleme
  • Toplama öncesinde belirsiz veri çoğaltma
  • Farklı hiyerarşi seviyelerinde DISTINCT ile toplamanın yanlış kombinasyonu

Gerçek hayattan bir örnek

Olumsuz vaka

Bir iş analisti COUNT(DISTINCT user_id) kullanarak benzersiz müşteri raporu oluşturuyor, ancak user_id gerçekte NULL veya dublike olabilir (örneğin, geçici hesaplar). Gerçek kullanıcı sayısı, raporda bozulmuş göstergeler ile daha fazla çıkıyor.

Artıları:

  • Hızlı rapor gerçekleştirme

Eksileri:

  • Yanlış metrikler nedeniyle yanlış iş kararları

Olumlu vaka

Analist, öncelikle verileri temizleyerek, NULL ve belirgin tekrarları alt sorgularda filtreliyor ve ayrıca karmaşık benzersizlik kriterleri için SET işlemleri kullanıyor.

Artıları:

  • Doğru ve şeffaf metrikler
  • Geçerli iş kararları ve KPI'lar

Eksileri:

  • Daha karmaşık sorgu, test verileri üzerinde kalite kontrol gerektirir.