# PostgreSQL’de Kayan Toplam Nasıl Hesaplanır? (Örneklerle)
PostgreSQL veritabanınızda zaman serileri verisiyle çalışıyorsanız, kayan toplam (rolling sum) hesaplamak muhtemelen sık karşılaşacağınız bir işlemdir. Örneğin, son 7 günlük satışların toplamını, her gün için güncel olarak hesaplamak isteyebilirsiniz veya her ayın kümülatif satışlarını takip etmek isteyebilirsiniz. Bu makale, PostgreSQL’de kayan toplamı hesaplamanın farklı yöntemlerini, performans optimizasyonunu ve gerçek dünya senaryolarını adım adım ele alarak, yeni başlayanlardan uzmanlara kadar herkese rehberlik edecektir.
Öğrenme Yol Haritası:
* 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
PostgreSQL’de Kayan Toplam: Temel Kavramlar
Kayan toplam, bir veri kümesinde belirli bir pencere büyüklüğünde (örneğin, son 7 gün, son 3 ay) ardışık değerlerin toplamını hesaplama işlemidir. Bu işlem, trend analizi, anomalideteşim tespiti ve tahminleme gibi birçok uygulamada kullanılır. PostgreSQL’de kayan toplamı hesaplamak için genellikle pencere fonksiyonları kullanılır. Pencere fonksiyonları, bir satırın belirli bir satır kümesi üzerindeki (pencere) diğer satırlara göre hesaplama yapmasına olanak tanır. Bu pencere, ORDER BY cümleciği ile sıralanır ve PARTITION BY cümleciği ile gruplandırılabilir.
PostgreSQL’de Kayan Toplam Nasıl Hesaplanır? (Adım Adım)
Öncelikle basit bir örnek ile başlayalım. Aşağıdaki tabloda günlük satış verilerimiz olduğunu varsayalım:
CREATE TABLE sales (
sale_date DATE,
amount NUMERIC
);
INSERT INTO sales (sale_date, amount) VALUES
('2024-01-01', 100),
('2024-01-02', 150),
('2024-01-03', 200),
('2024-01-04', 120),
('2024-01-05', 180),
('2024-01-06', 250),
('2024-01-07', 100);
Son 3 günlük kayan toplamı hesaplamak için aşağıdaki sorguyu kullanabiliriz:
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as rolling_sum_3
FROM
sales;
Bu sorgu, SUM() pencere fonksiyonunu kullanarak, her satır için kendisinden önceki iki satır ve kendisinin toplamını hesaplar (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW). ORDER BY sale_date ASC cümleciği, toplamın tarih sırasına göre hesaplanmasını sağlar.
Gerçek Hayat Örneği: Web Sitesi Trafiği Analizi
Bir web sitesinin günlük ziyaretçi sayılarını takip ettiğinizi ve son 7 günlük ziyaretçi sayısının kayan toplamını hesaplamak istediğinizi varsayalım. Aşağıdaki tabloda günlük ziyaretçi sayıları bulunmaktadır:
CREATE TABLE website_traffic (
visit_date DATE,
visitors INTEGER
);
--Örnek Veriler (buraya gerçek verileriniz gelecek)
INSERT INTO website_traffic (visit_date, visitors) VALUES
('2024-01-20', 1000), ('2024-01-21', 1200), ('2024-01-22', 1500), ('2024-01-23', 1100),
('2024-01-24', 1300), ('2024-01-25', 1400), ('2024-01-26', 1600), ('2024-01-27', 1800),
('2024-01-28', 2000);
Son 7 günlük kayan toplamı hesaplamak için aşağıdaki sorguyu kullanabilirsiniz:
SELECT
visit_date,
visitors,
SUM(visitors) OVER (ORDER BY visit_date ASC ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as rolling_sum_7
FROM
website_traffic;
Kayan Toplam Hesaplamasında Performans Optimizasyonu
Büyük veri kümeleri için kayan toplam hesaplaması performans sorunlarına yol açabilir. Performansı optimize etmek için aşağıdaki yöntemleri kullanabilirsiniz:
* İndeksler: sale_date veya visit_date sütununa bir indeks eklemek sorgu performansını önemli ölçüde artırabilir.
* Materyalize Görünümler: Sık kullanılan kayan toplam hesaplamaları için materyalize görünümler oluşturmak, verileri önceden hesaplayarak sorgu süresini kısaltabilir.
* Pencere Fonksiyonu Optimizasyonu: Gereksiz pencere fonksiyonu kullanmaktan kaçının. Gerektiğinde, RANGE yerine ROWS kullanın, çünkü ROWS daha hızlıdır. Ancak, RANGE bazı durumlarda daha uygun olabilir.
Kayan Toplam: İleri Düzey Teknikler ve Edge Case’ler
Daha karmaşık senaryolar için, PARTITION BY cümleciğini kullanarak farklı gruplar için kayan toplam hesaplayabilirsiniz. Örneğin, farklı ürünler için günlük satışların kayan toplamını hesaplamak isteyebilirsiniz. Aşağıdaki örnekte, product_id sütununa göre gruplandırma yapılmıştır:
CREATE TABLE sales_by_product (
sale_date DATE,
product_id INTEGER,
amount NUMERIC
);
-- Örnek veriler
INSERT INTO sales_by_product (sale_date, product_id, amount) VALUES
('2024-01-01', 1, 100), ('2024-01-01', 2, 50),
('2024-01-02', 1, 150), ('2024-01-02', 2, 75),
('2024-01-03', 1, 200), ('2024-01-03', 2, 100);
SELECT
sale_date,
product_id,
amount,
SUM(amount) OVER (PARTITION BY product_id ORDER BY sale_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as rolling_sum_2
FROM
sales_by_product;
Ayrıca, eksik tarihler veya sıfır değerler gibi edge case’leri ele almak için ek sorgu mantığı eklemeniz gerekebilir. Bu durumlar için COALESCE fonksiyonu veya koşullu ifadeler kullanılabilir. Örneğin, eksik tarihler için sıfır değer atamak için COALESCE fonksiyonunu kullanabilirsiniz. Daha detaylı bilgi için [fatihsoysal.com](https://fatihsoysal.com) adresini ziyaret edebilirsiniz. (Buraya ilgili bir makale linki eklenebilir.)
Sonuç
PostgreSQL’de kayan toplam hesaplamak, pencere fonksiyonlarının doğru kullanımıyla nispeten kolaydır. Ancak, büyük veri kümeleri için performans optimizasyonu önemlidir. Bu makalede ele alınan yöntemler ve ipuçları, farklı karmaşıklık seviyelerindeki kayan toplam hesaplamalarında size yardımcı olacaktır.
Sıkça Sorulan Sorular:
1. Kayan toplam için hangi pencere fonksiyonlarını kullanabilirim? SUM(), AVG(), COUNT(), MIN(), MAX() gibi birçok pencere fonksiyonu kayan toplam hesaplamasında kullanılabilir.
2. ROWS ve RANGE arasındaki fark nedir? ROWS, belirli sayıda satırı kapsar; RANGE, belirli bir değer aralığını kapsar.
3. Kayan toplam hesaplamasını nasıl optimize edebilirim? İndeksler, materyalize görünümler ve pencere fonksiyonu optimizasyonu kullanarak.
4. Eksik verilerle nasıl başa çıkabilirim? COALESCE fonksiyonu veya koşullu ifadeler kullanarak.
5. Farklı gruplar için kayan toplam nasıl hesaplanır? PARTITION BY cümleciğini kullanarak.
Yazar: Fatih Soysal
