# PostgreSQL’de İki Sütunun Benzersiz Kombinasyonlarını Saymak
PostgreSQL veritabanınızda iki sütunun benzersiz kombinasyonlarını saymanız mı gerekiyor? Örneğin, bir e-ticaret sitesindeki müşterilerin satın aldığı ürünlerin benzersiz kombinasyonlarını mı analiz etmek istiyorsunuz, ya da bir sosyal medya platformunda kullanıcıların takip ettiği benzersiz profil çiftlerini mi belirlemek istiyorsunuz? Bu makale, PostgreSQL kullanarak bu tür benzersiz kombinasyonları saymanın farklı yöntemlerini, performans optimizasyon tekniklerini ve gerçek dünya senaryolarını ele alarak adım adım bir rehber sunmaktadır. PostgreSQL’in güçlü yeteneklerini kullanarak verilerinizden anlamlı içgörüler elde etmenizi sağlayacak pratik çözümler bulacaksınız.
Öğrenme Yol Haritası
Bu makale, PostgreSQL’de iki sütunun benzersiz kombinasyonlarını saymayı öğrenmek için üç seviyeli bir yol haritası sunmaktadır:
Yeni Başlayan: Temel SQL sorguları ve COUNT(DISTINCT) fonksiyonunun kullanımı ile başlayacağız. Basit bir örnek üzerinden adım adım ilerleyeceğiz.
Orta Seviye: Gerçek dünya senaryolarına ve daha karmaşık sorgulara geçeceğiz. Performans optimizasyonu için ipuçları ve farklı yaklaşım yöntemleri ele alınacaktır.
İleri Seviye: Karmaşık sorguların performans analizi ve optimize edilmesi, edge case‘ler ve olası sorunlar ile başa çıkma stratejileri incelenecektir.
PostgreSQL Temelleri: COUNT(DISTINCT) Fonksiyonu ve SET Operatörleri
PostgreSQL’de benzersiz değerleri saymanın en yaygın yolu COUNT(DISTINCT) fonksiyonudur. Bu fonksiyon, belirtilen sütunlardaki benzersiz değerlerin sayısını döndürür. Ancak, iki sütunun kombinasyonunu saymak için doğrudan COUNT(DISTINCT sütun1, sütun2) kullanmak yeterli olmayabilir. Çünkü bu, her iki sütunun aynı anda benzersiz değerlerini sayar. Bizim ihtiyacımız olan ise, sütun çiftlerinin benzersiz kombinasyonlarını saymaktır.
Örneğin, aşağıdaki tabloda müşterilerin satın aldığı ürünler yer alsın:
| MüşteriID | ÜrünID |
|—|—|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
| 3 | 103 |
| 1 | 101 |
COUNT(DISTINCT MüşteriID, ÜrünID) sorgusu, (1,101), (1,102), (2,101), (3,103) gibi dört benzersiz kombinasyonu sayacaktır. Ancak (1,101) çiftinin iki kez tekrarlandığını göz önünde bulundurursak bu yeterli değildir.
PostgreSQL’de İki Sütunun Benzersiz Kombinasyonlarını Sayma: Adım Adım Uygulama
Yeni Başlayan:
Aşağıdaki SQL sorgusu, müşteri_ürün tablosunda bulunan MüşteriID ve ÜrünID sütunlarının benzersiz kombinasyonlarını sayar:
SELECT COUNT(*)
FROM (
SELECT DISTINCT MüşteriID, ÜrünID
FROM müşteri_ürün
) AS unique_combinations;
Bu sorgu önce iç sorgu ile benzersiz MüşteriID ve ÜrünID kombinasyonlarını seçer ve daha sonra dış sorgu bu benzersiz kombinasyonların sayısını hesaplar. Bu, yeni başlayanlar için en anlaşılır ve basit yöntemdir.
Orta Seviye:
Şimdi, bir e-ticaret sitesindeki satış verilerini ele alalım. Her satır bir siparişi temsil etsin ve siparisler tablosunda musteri_id ve urun_id sütunları olsun. Aşağıdaki sorgu, her müşterinin satın aldığı benzersiz ürün kombinasyonlarının sayısını verir:
SELECT COUNT(*)
FROM (
SELECT DISTINCT ARRAY[musteri_id, urun_id] AS unique_combinations
FROM siparisler
) AS unique_combinations_count;
Bu sorgu, ARRAY fonksiyonunu kullanarak her müşteri-ürün çiftini bir diziye dönüştürür ve daha sonra DISTINCT ile benzersiz kombinasyonları seçer. Bu yöntem, büyük veri kümeleri için daha verimli olabilir. GROUP BY kullanımıyla da müşteri bazında benzersiz ürün sayısı bulunabilir.
İleri Seviye:
Daha karmaşık bir senaryo olarak, bir müşterinin bir siparişte birden fazla ürün satın aldığını ve bu ürünlerin kombinasyonlarının sayısını bulmak istediğimizi düşünelim. Bu durumda, jsonb veri tipi kullanılabilir:
SELECT COUNT(*)
FROM (
SELECT DISTINCT jsonb_agg(jsonb_build_object('urun_id', urun_id)) AS urun_kombinasyonlari
FROM siparisler
GROUP BY musteri_id
) as benzersiz_kombinasyonlar;
Bu sorgu, her müşteri için satın alınan ürünleri bir jsonb dizisi olarak birleştirir ve daha sonra benzersiz kombinasyonları sayar. Bu, karmaşık verileri yönetmek için güçlü bir yöntemdir, ancak performans analizi ve indeksleme önemlidir.
Performans Optimizasyonu
Büyük veri kümeleri için performans kritiktir. Aşağıdaki teknikler performansı iyileştirmeye yardımcı olabilir:
* İndeksleme: MüşteriID ve ÜrünID sütunlarına indeks eklemek, DISTINCT işlemini hızlandıracaktır.
* Materyalize Görünümler: Sık kullanılan sorgular için materyalize görünümler oluşturmak, tekrarlanan hesaplamaları önler.
* Parçalama: Büyük tabloları parçalamak, sorguları daha küçük veri kümelerine indirger.
* Analiz: EXPLAIN ANALYZE komutu ile sorgu planını inceleyerek darboğazları belirleyin ve optimize edin.
Gerçek Dünya Senaryoları ve Vaka Analizleri
E-ticaret: Müşterilerin satın aldığı ürün kombinasyonlarını analiz ederek, önerilen ürünlerin doğruluğunu artırabilir ve pazarlama stratejilerini geliştirebilirsiniz.
Sosyal Medya: Kullanıcıların takip ettiği diğer kullanıcıların benzersiz kombinasyonlarını analiz ederek, sosyal ağ yapısını ve etkileşim modellerini anlayabilirsiniz.
Sağlık: Hastaların sahip olduğu hastalıkların benzersiz kombinasyonlarını analiz ederek, hastalıkların birlikte görülme sıklıklarını ve ilişkilerini belirleyebilirsiniz.
Sıkça Sorulan Sorular (SSS)
1. COUNT(DISTINCT) fonksiyonu ne kadar performanslıdır? Büyük veri kümeleri için performansı düşürebilir. İndeksleme ve diğer optimizasyon teknikleri kullanılmalıdır.
2. İki sütunun yerine üç veya daha fazla sütunun benzersiz kombinasyonlarını nasıl sayabilirim? Yukarıdaki örneklerdeki yöntemleri genişletebilir, ARRAY veya jsonb kullanarak daha fazla sütunu birleştirip benzersiz kombinasyonları sayabilirsiniz.
3. Benzersiz kombinasyonları saymanın başka bir yolu var mı? GROUP BY kullanarak da benzersiz kombinasyonları sayabilirsiniz, ancak bu yöntem, COUNT(DISTINCT)‘e göre daha karmaşık olabilir.
4. Hangi yöntem en verimlidir? En verimli yöntem, veri kümesinin büyüklüğüne, veri dağılımına ve diğer faktörlere bağlıdır. Performans testleri yaparak en uygun yöntemi belirlemek önemlidir.
5. Performans sorunlarıyla karşılaştığımda ne yapmalıyım? EXPLAIN ANALYZE komutunu kullanarak sorgu planını inceleyin, indeksleme, parçalama gibi optimizasyon tekniklerini uygulayın ve veritabanı yöneticinizle iletişime geçin.
Yazar: Fatih Soysal