# PostgreSQL’de Geçen Ayın Tüm Satırlarını Seçme
Geçen ayın verilerini analiz etmek, iş zekası raporları oluşturmak veya periyodik raporlama yapmak için sıklıkla ihtiyaç duyduğumuz bir işlemdir. PostgreSQL veritabanınızı kullanarak geçen ayın tüm satırlarını nasıl verimli ve doğru bir şekilde seçebileceğinizi adım adım öğreneceğiz. Bu makale, yeni başlayanlardan ileri seviye kullanıcılara kadar herkes için kapsamlı bir rehber niteliğindedir.
Öğrenme Yol Haritası:
* Yeni Başlayan: (Adım adım açıklama, Basit kod örneği)
* Orta: (Gerçek hayat örneği, Optimizasyon ipuçları)
* İleri Düzey: (Performans analizi, Edge caseler)
PostgreSQL Tarih Fonksiyonlarını Anlamak
PostgreSQL, tarih ve zaman işlemleri için güçlü fonksiyonlar sunar. Geçen ayın verilerini seçmek için date_trunc, age, interval gibi fonksiyonları kullanacağız. Öncelikle bu fonksiyonların nasıl çalıştığını anlamak önemlidir.
date_trunc: Belirli bir zaman birimine göre bir tarih değerini yuvarlar. Örneğin, date_trunc('month', '2024-03-15'::date) ifadesi, ‘2024-03-01’ değerini döndürür.
age: İki tarih değeri arasındaki farkı hesaplar. Sonuç, yıl, ay ve gün cinsinden bir interval tipindedir.
interval: Süreleri temsil eder. Örneğin, ‘1 month’ bir ay süresini, ‘-1 month’ ise bir ay önceki süreyi temsil eder.
Geçen Ayın Verilerini Seçme: Yeni Başlayanlar İçin Adım Adım Kılavuz
Diyelim ki, orders adında bir tablomuz var ve bu tabloda order_date adında bir tarih sütunu bulunuyor. Geçen ayın tüm siparişlerini seçmek için şu sorguyu kullanabiliriz:
SELECT *
FROM orders
WHERE order_date >= date_trunc('month', CURRENT_DATE - INTERVAL '1 month')
AND order_date < date_trunc('month', CURRENT_DATE);
Bu sorgu, CURRENT_DATE fonksiyonuyla bugünün tarihini alır, bir ay geriye gider (INTERVAL '1 month') ve date_trunc fonksiyonuyla geçen ayın başlangıç tarihini belirler. order_date sütununun bu tarih ve bugünün başlangıç tarihi arasında olan satırları seçer. >= ve < operatörlerinin kullanımı, ayın son gününü de dahil etmemizi sağlar.
Geçen Ayın Verilerini Seçme: Gerçek Hayat Örneği ve Optimizasyon İpuçları
Bir e-ticaret şirketinde çalıştığımızı ve geçen ayın satış raporunu oluşturmamız gerektiğini düşünelim. orders tablomuzda order_date, customer_id, total_amount gibi sütunlar bulunmaktadır. Geçen ayın toplam satışını hesaplamak için aşağıdaki sorguyu kullanabiliriz:
SELECT SUM(total_amount) AS total_sales
FROM orders
WHERE order_date >= date_trunc('month', CURRENT_DATE - INTERVAL '1 month')
AND order_date < date_trunc('month', CURRENT_DATE);
Optimizasyon İpuçları:
* İndeksler: order_date sütununa bir indeks eklemek, sorgunun performansını önemli ölçüde artırabilir. PostgreSQL'in indeks oluşturma mekanizmasını anlamak ve doğru indeksleri seçmek çok önemlidir. Daha detaylı bilgi için [fatihsoysal.com](https://fatihsoysal.com) adresindeki PostgreSQL performans optimizasyonu makalelerine göz atabilirsiniz.
* WHERE koşullarını optimize etme: Gereksiz koşulların sorguda bulunması performansı olumsuz etkiler. Sadece gerekli koşulları eklemeye özen gösterin.
* Fonksiyonel indeksler: Karmaşık tarih hesaplamaları içeren sorgularda fonksiyonel indeksler kullanmak performansı artırabilir.
Geçen Ayın Verilerini Seçme: Performans Analizi ve Edge Case'ler
Büyük veri kümeleri üzerinde çalışırken, sorgunun performansı kritik önem taşır. EXPLAIN ANALYZE komutu ile sorgunun yürütme planını inceleyebilir ve performans darboğazlarını tespit edebiliriz. Örneğin:
EXPLAIN ANALYZE
SELECT SUM(total_amount) AS total_sales
FROM orders
WHERE order_date >= date_trunc('month', CURRENT_DATE - INTERVAL '1 month')
AND order_date < date_trunc('month', CURRENT_DATE);
Bu komut, sorgunun nasıl yürütüldüğünü, hangi indekslerin kullanıldığını ve her adımın ne kadar sürdüğünü gösterir. Sonuçları analiz ederek, sorguyu optimize etmek için gerekli adımları belirleyebilirsiniz.
Edge Case'ler:
* Şubat ayı: Şubat ayının 28 veya 29 gün olması, sorgunun doğru çalışmasını etkileyebilir. Ancak yukarıdaki sorgu, bu durumu doğru şekilde ele alır.
* Zaman dilimi: CURRENT_DATE fonksiyonu, veritabanı sunucusunun zaman dilimini kullanır. Farklı zaman dilimlerinde çalışan uygulamalar için dikkatli olmak gerekir.
PostgreSQL'de Tarih İşlemlerini Gelişmiş Tekniklerle Kullanma
Daha karmaşık tarih işlemleri için, PostgreSQL'in sunduğu diğer fonksiyonları kullanabilirsiniz. Örneğin, geçen ayın son gününü bulmak için date_trunc ve interval fonksiyonlarını birlikte kullanabilirsiniz:
SELECT (date_trunc('month', CURRENT_DATE) - INTERVAL '1 day')::date AS last_day_of_last_month;
Bu örnekte, öncelikle bu ayın başlangıç tarihi bulunur, daha sonra bir gün geriye gidilerek geçen ayın son günü hesaplanır.
Vaka Analizi: Bir E-Ticaret Şirketi Örneği
Bir e-ticaret şirketinin geçen ayın müşteri davranışlarını analiz etmek istediğini varsayalım. Bu şirket, müşterilerin sipariş sayısı, toplam harcama miktarı ve ortalama sipariş değeri gibi metrikleri takip eder. Geçen ayın bu verileri için aşağıdaki sorgu kullanılabilir:
SELECT
COUNT(*) AS total_orders,
SUM(total_amount) AS total_spending,
AVG(total_amount) AS average_order_value
FROM orders
WHERE order_date >= date_trunc('month', CURRENT_DATE - INTERVAL '1 month')
AND order_date < date_trunc('month', CURRENT_DATE);
Bu sorgu, geçen ayın toplam sipariş sayısını, toplam harcama miktarını ve ortalama sipariş değerini hesaplar.
Sonuç
PostgreSQL'de geçen ayın tüm satırlarını seçmek için farklı yöntemler ve optimizasyon teknikleri mevcuttur. Bu makalede ele aldığımız yöntemler, farklı karmaşıklık seviyelerindeki sorgular için kullanılabilecek pratik çözümler sunmaktadır. Veri büyüklüğüne ve performans gereksinimlerine bağlı olarak, en uygun yöntemi seçmek önemlidir. PostgreSQL'in sunduğu güçlü tarih fonksiyonlarını ve optimizasyon tekniklerini kullanarak, verilerinizden daha fazla değer elde edebilirsiniz.
Sıkça Sorulan Sorular:
1. Geçen ayın ilk ve son gününü nasıl belirleyebilirim? date_trunc('month', CURRENT_DATE - INTERVAL '1 month') ve (date_trunc('month', CURRENT_DATE) - INTERVAL '1 day')::date ifadeleri kullanılabilir.
2. Çok büyük bir tabloda çalışıyorsam performansı nasıl artırabilirim? İndeksler oluşturun, WHERE koşullarını optimize edin ve fonksiyonel indeksleri değerlendirin.
3. Farklı zaman dilimlerini nasıl yönetebilirim? CURRENT_DATE yerine CURRENT_TIMESTAMP kullanabilir ve zaman dilimini açıkça belirtebilirsiniz.
4. Geçen ayın belirli bir tarih aralığındaki verileri nasıl seçebilirim? WHERE koşuluna ek tarih filtreleri ekleyebilirsiniz.
5. Performans sorunlarını nasıl tespit edebilirim? EXPLAIN ANALYZE komutunu kullanarak sorgunun yürütme planını inceleyin.
Yazar: Fatih Soysal