# PostgreSQL’de Ay ve Yıla Göre Gruplandırma
PostgreSQL veritabanınızda tarih verileriniz var ve bu verileri ay ve yıla göre gruplayarak analiz etmek istiyorsunuz. Örneğin, her ay kaç ürün satıldığını, her yılın cirosunu veya her ayın ortalama sıcaklığını bulmak isteyebilirsiniz. Bu makalede, PostgreSQL’de tarih verilerini ay ve yıla göre gruplandırmanın farklı yöntemlerini, performans optimizasyonunu ve gerçek dünya senaryolarını adım adım ele alacağız. PostgreSQL’in güçlü tarih fonksiyonlarını kullanarak verilerinizi etkili bir şekilde analiz etmeyi öğreneceksiniz.
Öğrenme Yol Haritası
Bu makale, PostgreSQL’de ay ve yıla göre gruplandırmayı öğrenmek için kademeli bir yol haritası sunmaktadır:
Yeni Başlayan: Temel DATE_TRUNC fonksiyonu kullanımı ve basit bir örnek.
Orta Seviye: Gerçek dünya senaryoları, EXTRACT fonksiyonu, performans ipuçları ve daha karmaşık sorgular.
İleri Seviye: Performans analizi, indeksleme stratejileri, edge case’ler ve büyük veri kümeleri için optimizasyon teknikleri.
PostgreSQL Tarih Fonksiyonları: Temel Kavramlar
PostgreSQL, tarih ve zaman verileriyle çalışmak için zengin bir fonksiyon seti sunar. Bu fonksiyonlar, verilerinizi manipüle etmenizi, formatlamanızı ve analiz etmenizi sağlar. Ay ve yıla göre gruplandırma için en önemli fonksiyonlar DATE_TRUNC ve EXTRACT‘tir.
DATE_TRUNC: Belirli bir zaman birimine göre bir tarih değerini keser. Örneğin, DATE_TRUNC('month', '2024-03-15') sonucu 2024-03-01 olur. Yıl için 'year' parametresi kullanılır.
EXTRACT: Bir tarih değerinden belirli bir bileşeni (yıl, ay, gün vb.) ayıklar. Örneğin, EXTRACT(YEAR FROM '2024-03-15') sonucu 2024 olur.
Ay ve Yıla Göre Gruplandırma: Adım Adım Uygulama
Yeni Başlayan:
Diyelim ki bir satislar adlı tablomuz var ve bu tabloda satis_tarihi (date) ve miktar (integer) sütunları bulunuyor. Her ay kaç ürün satıldığını bulmak için aşağıdaki sorguyu kullanabiliriz:
SELECT
DATE_TRUNC('month', satis_tarihi) AS ay,
SUM(miktar) AS toplam_satis
FROM
satislar
GROUP BY
ay
ORDER BY
ay;
Bu sorgu, DATE_TRUNC fonksiyonunu kullanarak her satis_tarihi değerini ayın başına yuvarlar ve ardından SUM fonksiyonu ile her ayın toplam satış miktarını hesaplar. Sonuçlar ay sütununa göre sıralanır.
Ay ve Yıla Göre Gruplandırma: Gerçek Dünya Örnekleri
Orta Seviye:
Şimdi daha karmaşık bir senaryo ele alalım. Bir e-ticaret şirketinde çalışıyorsunuz ve her yılın her ayındaki toplam sipariş sayısını ve toplam gelirini öğrenmek istiyorsunuz. siparisler adlı bir tablonuz olduğunu ve bu tablonun siparis_tarihi (date), siparis_adedi (integer) ve toplam_tutar (numeric) sütunlarını içerdiğini varsayalım.
SELECT
EXTRACT(YEAR FROM siparis_tarihi) AS yil,
EXTRACT(MONTH FROM siparis_tarihi) AS ay,
COUNT(*) AS toplam_siparis,
SUM(toplam_tutar) AS toplam_gelir
FROM
siparisler
GROUP BY
yil, ay
ORDER BY
yil, ay;
Bu sorgu, EXTRACT fonksiyonunu kullanarak her siparişin yılını ve ayını ayıklar. COUNT(*) fonksiyonu her yılın her ayındaki toplam sipariş sayısını, SUM(toplam_tutar) ise toplam geliri hesaplar. Sonuçlar önce yıla, sonra aya göre sıralanır.
Performans Optimizasyonu ve İndeksleme
İleri Seviye:
Büyük veri kümeleriyle çalışırken, sorgu performansı kritik öneme sahiptir. Performansı iyileştirmek için indeksleme önemli bir adımdır. satis_tarihi sütununa bir indeks eklemek, yukarıdaki sorguların çalışma süresini önemli ölçüde azaltabilir.
CREATE INDEX idx_satis_tarihi ON satislar (satis_tarihi);
Ayrıca, DATE_TRUNC fonksiyonunun sorgunun performansını etkileyebileceğini unutmayın. Çok büyük tablolar için, önceden hesaplanmış ay ve yıl değerlerini içeren ek bir sütun oluşturmak ve bu sütuna indeks eklemek daha verimli olabilir. Bu, her sorgu çalıştırıldığında DATE_TRUNC fonksiyonunun tekrar tekrar hesaplanmasını önler.
Edge Case’ler:
Boş tarih değerleriyle karşılaşabilirsiniz. Bu durumları ele almak için COALESCE fonksiyonunu kullanabilirsiniz. Örneğin, COALESCE(satis_tarihi, '1900-01-01') boş tarih değerlerini 1 Ocak 1900 tarihine dönüştürür. Ancak, bu yaklaşımın veri analizinizi nasıl etkileyebileceğini dikkatlice değerlendirmelisiniz.
Karmaşık Sorgu Örnekleri ve Vaka Analizleri
Bir üniversitede öğrenci kayıtlarını takip eden bir veritabanı düşünelim. Öğrenci kayıt tarihlerini içeren bir tabloda, her yıl kaç öğrencinin kayıt olduğunu bulmak isteyebiliriz. Ya da bir hava durumu veritabanında, her ayın ortalama sıcaklığını hesaplamak isteyebiliriz. Bu ve benzeri senaryolar için yukarıdaki teknikleri ve fonksiyonları kullanarak karmaşık sorgular oluşturabilir ve analiz yapabilirsiniz. CASE ve WHEN ifadeleri ile daha detaylı koşullu gruplandırmalar da yapabilirsiniz.
Sonuç
PostgreSQL’de tarih verilerini ay ve yıla göre gruplandırmak, verilerinizi analiz etmek ve anlamlı sonuçlar çıkarmak için güçlü bir araçtır. DATE_TRUNC ve EXTRACT fonksiyonlarını kullanarak, farklı karmaşıklık seviyelerindeki sorguları oluşturabilirsiniz. Performans optimizasyonu için indeksleme ve önceden hesaplanmış sütunlar gibi stratejileri kullanmayı unutmayın. Büyük veri kümeleri için verimli sorgular yazmak için daha gelişmiş teknikler öğrenmek isteyebilirsiniz. Daha fazla bilgi için [Fatih Soysal’ın bloguna](https://fatihsoysal.com) göz atabilirsiniz.
Sıkça Sorulan Sorular:
1. DATE_TRUNC ve EXTRACT fonksiyonları arasındaki fark nedir? DATE_TRUNC, bir tarihi belirli bir zaman birimine yuvarlar, EXTRACT ise bir tarihten belirli bir bileşeni ayıklar.
2. Ay ve yıl dışında başka zaman birimlerini de gruplandırabilir miyim? Evet, DATE_TRUNC fonksiyonu day, week, quarter, year gibi birçok zaman birimini destekler.
3. Büyük veri kümeleri için performansı nasıl iyileştirebilirim? İndeksleme, önceden hesaplanmış sütunlar ve daha gelişmiş sorgu optimizasyon teknikleri kullanın.
4. Boş tarih değerleriyle nasıl başa çıkabilirim? COALESCE fonksiyonu veya benzeri fonksiyonlar kullanarak boş değerleri işlemeniz gerekir.
5. Daha karmaşık tarihsel analizler için hangi fonksiyonları kullanabilirim? AGE, DATE_PART, TO_DATE, TO_TIMESTAMP gibi fonksiyonlar daha gelişmiş analizler için kullanılabilir.
Yazar: Fatih Soysal
