Takip et

PostgreSQL’de Ağırlıklı Ortalama Nasıl Hesaplanır

# PostgreSQL’de Ağırlıklı Ortalama Nasıl Hesaplanır?

PostgreSQL veritabanınızda farklı öneme sahip verileriniz mi var? Örneğin, öğrencilerin farklı ağırlıklı ödevlerden aldıkları notları mı değerlendirmeniz gerekiyor? Ya da bir ürünün farklı mağazalardaki satış fiyatlarını ortalamalarken, her mağazanın satış hacmini de hesaba katmanız mı lazım? Bu gibi durumlarda standart ortalama hesaplaması yeterli olmayabilir. İşte bu noktada ağırlıklı ortalama devreye giriyor. Bu makalede, PostgreSQL kullanarak ağırlıklı ortalama hesaplamanın inceliklerini, adım adım bir rehberle ve gerçek dünya örnekleriyle ele alacağız. Ağırlıklı ortalamayı anlamak ve PostgreSQL’de verimli bir şekilde uygulamak için ihtiyacınız olan her şeyi bu makalede bulacaksınız.

Öğrenme Yol Haritası

Bu makale, ağırlıklı ortalama hesaplamayı PostgreSQL’de öğrenmek için üç seviyeden oluşan bir yol haritası sunar:

Yeni Başlayan: Adım adım açıklama, basit kod örneği.

Orta Seviye: Gerçek hayat örneği, optimizasyon ipuçları.

İleri Seviye: Performans analizi, edge case’ler (kenar durumları).

Temel Kavramlar: Ağırlıklı Ortalama Nedir?

Ağırlıklı ortalama, her veri noktasına farklı bir ağırlık vererek hesaplanan bir ortalama türüdür. Standart ortalama, tüm veri noktalarına eşit ağırlık verirken, ağırlıklı ortalama, bazı veri noktalarının diğerlerinden daha önemli olduğunu kabul eder. Formül şu şekildedir:

Ağırlıklı Ortalama = (∑(xᵢ * wᵢ)) / ∑wᵢ

Burada:

* xᵢ: i. veri noktası
* wᵢ: i. veri noktasının ağırlığı
* ∑: toplamı gösterir.

Örneğin, bir öğrencinin üç sınavdan aldığı notlar ve sınavların ağırlıkları şöyle olsun:

* Sınav 1: Not: 80, Ağırlık: 0.2
* Sınav 2: Not: 90, Ağırlık: 0.3
* Sınav 3: Not: 70, Ağırlık: 0.5

Ağırlıklı ortalama: (80 * 0.2) + (90 * 0.3) + (70 * 0.5) = 79 olur.

PostgreSQL’de Ağırlıklı Ortalama Nasıl Hesaplanır? (Yeni Başlayanlar İçin)

Basit bir örnek ile başlayalım. Öğrenci notları ve sınav ağırlıklarını içeren bir tablo oluşturalım:

CREATE TABLE ogrenci_notlari (
    ogrenci_id INT,
    sinav_adi TEXT,
    not INT,
    agirlik REAL
);

INSERT INTO ogrenci_notlari (ogrenci_id, sinav_adi, not, agirlik) VALUES
(1, 'Vize', 70, 0.4),
(1, 'Final', 85, 0.6),
(2, 'Vize', 90, 0.4),
(2, 'Final', 75, 0.6);

Şimdi, her öğrencinin ağırlıklı ortalamasını hesaplayalım:

SELECT
    ogrenci_id,
    SUM(not * agirlik) / SUM(agirlik) AS agirlikli_ortalama
FROM
    ogrenci_notlari
GROUP BY
    ogrenci_id;

Bu sorgu, her öğrenci için not ve agirlik değerlerini çarpar, bunların toplamını alır ve sonra tüm ağırlıkların toplamına böler. Sonuç olarak, her öğrencinin ağırlıklı ortalamasını elde ederiz.

Gerçek Hayat Örneği: Ürün Fiyatlarının Ağırlıklı Ortalaması (Orta Seviye)

Bir e-ticaret platformunda, aynı ürünün farklı satıcılardan farklı fiyatlarla satıldığını düşünelim. Her satıcının satış hacmini de bildiğimize göre, ürünün ağırlıklı ortalama fiyatını hesaplayabiliriz.

CREATE TABLE urun_fiyatlari (
    urun_id INT,
    satici_adi TEXT,
    fiyat NUMERIC,
    satis_hacim INT
);

INSERT INTO urun_fiyatlari (urun_id, satici_adi, fiyat, satis_hacim) VALUES
(1, 'SaticiA', 100, 100),
(1, 'SaticiB', 120, 50),
(1, 'SaticiC', 90, 150);

Ağırlıklı ortalama fiyatı hesaplamak için şu sorguyu kullanabiliriz:

SELECT
    urun_id,
    SUM(fiyat * satis_hacim)::NUMERIC / SUM(satis_hacim) AS agirlikli_ortalama_fiyat
FROM
    urun_fiyatlari
GROUP BY
    urun_id;

Burada ::NUMERIC casting’i, olası bölme işlemi hatalarını önlemek için kullanılır. satis_hacim değerleri ağırlık olarak kullanılır.

Performans Optimizasyonu İpuçları (Orta Seviye)

Büyük veri setlerinde performansı iyileştirmek için aşağıdaki ipuçlarını kullanabilirsiniz:

* İndexler: ogrenci_id ve urun_id gibi sık kullanılan sütunlara index eklemek sorgu performansını artırır.
* View’ler: Karmaşık sorguyu bir view olarak tanımlayarak tekrar kullanılabilirlik ve performans kazancı sağlayabilirsiniz.
* Analiz: ANALYZE urun_fiyatlari; komutu ile veritabanı istatistiklerini güncelleyerek sorgu planlayıcısının daha iyi kararlar vermesini sağlayabilirsiniz.

PostgreSQL’de Ağırlıklı Ortalamanın İleri Düzey Teknikleri (İleri Seviye)

Daha karmaşık senaryolar için, pencere fonksiyonları ve ortak tablo ifadeleri (CTE’ler) kullanabiliriz. Örneğin, her öğrencinin sınıfındaki sırasını da hesaba katarak ağırlıklı ortalamasını hesaplayabiliriz:

WITH OgrenciNotlariAgirlikli AS (
    SELECT
        ogrenci_id,
        SUM(not * agirlik) / SUM(agirlik) AS agirlikli_ortalama
    FROM
        ogrenci_notlari
    GROUP BY
        ogrenci_id
),
SinifSiralamasi AS (
    SELECT
        ogrenci_id,
        agirlikli_ortalama,
        RANK() OVER (ORDER BY agirlikli_ortalama DESC) as sinif_siralamasi
    FROM
        OgrenciNotlariAgirlikli
)
SELECT * FROM SinifSiralamasi;

Bu örnekte, önce ağırlıklı ortalama hesaplanır, daha sonra pencere fonksiyonu RANK() kullanılarak her öğrencinin sınıf içindeki sıralaması belirlenir. Bu şekilde daha detaylı analizler yapabiliriz.

Kenar Durumları (Edge Case’ler) ve Hata Yönetimi (İleri Seviye)

Ağırlıkların toplamının sıfır olması gibi kenar durumları, bölme işleminde hata oluşmasına neden olabilir. Bunun önüne geçmek için CASE ifadesi kullanabiliriz:

SELECT
    ogrenci_id,
    CASE
        WHEN SUM(agirlik) = 0 THEN 0  -- Ağırlıkların toplamı sıfır ise 0 döndür
        ELSE SUM(not * agirlik) / SUM(agirlik)
    END AS agirlikli_ortalama
FROM
    ogrenci_notlari
GROUP BY
    ogrenci_id;

Bu kod bloğu, ağırlıkların toplamının sıfır olması durumunda sıfır değerini döndürerek hata oluşmasını engeller. Diğer kenar durumlarını da benzer şekilde ele alabilirsiniz. Örneğin, NULL değerleri için uygun işlemler yapmanız gerekebilir.

Sonuç

PostgreSQL’de ağırlıklı ortalama hesaplamak, verileri daha anlamlı bir şekilde analiz etmenizi sağlar. Bu makalede, temel kavramlardan ileri düzey tekniklere kadar geniş bir yelpazede bilgi vermeye çalıştık. Veri setinizin büyüklüğüne ve karmaşıklığına bağlı olarak, performans optimizasyonu için farklı stratejiler kullanmanız gerekebilir. Unutmayın ki verimli ve doğru sonuçlar elde etmek için verilerinizi ve sorgu performansınızı dikkatlice analiz etmeniz önemlidir. Daha fazla PostgreSQL ipucu ve püf noktası için [fatihsoysal.com](https://fatihsoysal.com) sitesini ziyaret edebilirsiniz.

Sıkça Sorulan Sorular:

1. Ağırlıklı ortalama, standart ortalamadan ne zaman daha uygundur? Bazı veri noktalarının diğerlerinden daha önemli olduğu durumlarda, ağırlıklı ortalama daha doğru sonuçlar verir.

2. Ağırlıklar negatif olabilir mi? Evet, ancak yorumlanması daha karmaşık olabilir. Negatif ağırlıklar, veri noktasının ortalamayı aşağı çektiğini gösterir.

3. PostgreSQL’de ağırlıklı medyan nasıl hesaplanır? Ağırlıklı medyan hesaplamak için daha karmaşık sorgu yapılarını kullanmanız gerekebilir. Bu, pencere fonksiyonları ve özelleştirilmiş fonksiyonlar gerektirebilir.

4. Çok büyük veri setleri için performansı nasıl iyileştirebilirim? Parçalı işleme (partitioning), materyalize view’ler ve daha gelişmiş optimizasyon teknikleri kullanabilirsiniz.

5. Ağırlıklı ortalamada hataları nasıl önleyebilirim? Ağırlıkların toplamının sıfır olmaması ve NULL değerlerinin doğru bir şekilde ele alınması önemlidir.

Yazar: Fatih Soysal

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.