# PostgreSQL’de Günlük Veri Gruplandırma: Adım Adım Uygulama Rehberi
PostgreSQL veritabanınızda günlük satışları, web site trafiğini veya herhangi bir zaman serisine bağlı veriyi analiz etmek istiyorsunuz. Ancak, verileriniz saniyelik, dakikalık veya saatlik zaman damgalarıyla kaydedilmiş ve günlük toplamları veya ortalamaları görmek istiyorsunuz. İşte tam bu noktada PostgreSQL’in güçlü GROUP BY fonksiyonu ve tarih fonksiyonlarıyla günlük veri gruplandırma devreye giriyor. Bu makale, PostgreSQL’de günlük veri gruplandırmayı sıfırdan uzman seviyesine kadar adım adım açıklayacak, gerçek dünya örnekleri ve performans optimizasyon teknikleriyle dolu bir rehber sunacaktır. PostgreSQL’de günlük verileri nasıl etkili bir şekilde gruplayacağınızı öğrenmek için okumaya devam edin.
PostgreSQL’de Tarih ve Zaman Fonksiyonları: Temel Kavramlar
PostgreSQL, tarih ve zaman verilerini işlemek için zengin bir fonksiyon seti sunar. Bu fonksiyonlar, date, timestamp, timestamptz gibi veri tiplerini kullanarak çalışır. GROUP BY ile günlük verileri gruplandırmak için en sık kullanılan fonksiyonlar şunlardır:
* date(timestamp): Bir timestamp veya timestamptz değerini date tipine dönüştürür. Bu fonksiyon, günlük gruplandırmanın temelini oluşturur. Örneğin, date('2024-10-27 10:30:00') sonucu 2024-10-27 olur.
* EXTRACT(field FROM timestamp): timestamp veya date değerinden belirli bir alanı (yıl, ay, gün, saat, dakika, saniye) ayıklar. Örneğin, EXTRACT(DAY FROM '2024-10-27 10:30:00') sonucu 27 olur.
* to_char(timestamp, format): timestamp değerini belirtilen formata göre bir metin dizesine dönüştürür. Bu, çıktı formatını özelleştirmek için kullanışlıdır. Örneğin, to_char('2024-10-27 10:30:00', 'YYYY-MM-DD') sonucu 2024-10-27 olur.
PostgreSQL’de Günlük Veri Gruplandırma: Adım Adım Uygulamalı Kılavuz
Şimdi, PostgreSQL’de günlük veri gruplandırmanın pratik uygulamalarına geçelim. Aşağıdaki örneklerde, orders adlı bir tablomuz olduğunu ve bu tablonun order_date (timestamp) ve order_total (numeric) sütunlarını içerdiğini varsayacağız.
# Öğrenme Yol Haritası
Yeni Başlayan:
Adım 1: Basit Günlük Toplam Hesaplama
Aşağıdaki SQL sorgusu, her gün için toplam sipariş tutarını hesaplar:
SELECT date(order_date) AS order_day, SUM(order_total) AS total_daily_sales
FROM orders
GROUP BY order_day
ORDER BY order_day;
Bu sorgu, order_date sütununu date() fonksiyonu ile günlük tarihe dönüştürerek order_day adlı yeni bir sütun oluşturur. SUM(order_total) fonksiyonu ise her gün için toplam sipariş tutarını hesaplar. GROUP BY order_day ifadesi, sonuçları günlük olarak gruplar ve ORDER BY order_day ifadesi sonuçları tarih sırasına göre sıralar.
Adım 2: Günlük Sipariş Sayısı
Aşağıdaki sorgu ise her gün için yapılan toplam sipariş sayısını hesaplar:
SELECT date(order_date) AS order_day, COUNT(*) AS total_orders
FROM orders
GROUP BY order_day
ORDER BY order_day;
Bu örnekte, COUNT(*) fonksiyonu her gün için kaç satır (sipariş) olduğunu sayar.
Orta Seviye:
Gerçek Hayat Örneği: E-Ticaret Analizi
Bir e-ticaret şirketinde çalıştığınızı ve günlük satış trendlerini analiz etmek istediğinizi varsayalım. Aşağıdaki sorgu, her gün için toplam satış gelirini, ortalama sipariş değerini ve sipariş sayısını hesaplar:
SELECT
date(order_date) AS order_day,
SUM(order_total) AS total_revenue,
AVG(order_total) AS average_order_value,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_day
ORDER BY order_day;
Optimizasyon İpuçları:
* İndeksler: order_date sütununa bir indeks eklemek, sorgu performansını önemli ölçüde artırabilir. İndeks oluşturmak için aşağıdaki komutu kullanabilirsiniz: CREATE INDEX order_date_idx ON orders (order_date);
* WHERE Klauzu: Belirli bir tarih aralığını analiz etmek için WHERE klauzu kullanın. Örneğin, son 7 günün verilerini analiz etmek için:
SELECT date(order_date) AS order_day, SUM(order_total) AS total_daily_sales
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days'
GROUP BY order_day
ORDER BY order_day;
İleri Düzey:
Performans Analizi:
Karmaşık sorguların performansını analiz etmek için EXPLAIN ANALYZE komutunu kullanabilirsiniz. Bu komut, sorgunun yürütülme planını ve her adımın süresini gösterir. Performans darboğazlarını tespit etmek ve optimizasyon stratejileri geliştirmek için bu bilgiyi kullanabilirsiniz.
Edge Case’ler:
* Boş Tarihler: order_date sütununda boş değerler varsa, WHERE order_date IS NOT NULL klauzu kullanarak bu değerleri filtreleyebilirsiniz.
* Büyük Veri Setleri: Çok büyük veri setlerinde, parçalı sorgulama (partitioning) teknikleri performansı artırmak için kullanılabilir. PostgreSQL’de tabloları parçalara ayırmak, sorguların daha küçük veri kümeleri üzerinde çalışmasını sağlar. [fatihsoysal.com](https://fatihsoysal.com) adresinde PostgreSQL performans optimizasyonu hakkında daha fazla bilgi bulabilirsiniz. (Buraya bir makale linki eklenebilir)
* Zaman Dilimleri: timestamptz veri tipi kullanıyorsanız, zaman dilimlerini doğru bir şekilde yönetmek önemlidir. AT TIME ZONE fonksiyonu, farklı zaman dilimlerindeki verileri dönüştürmek için kullanılabilir.
Gerçek Dünya Senaryoları ve Vaka Çalışmaları
Vaka 1: Web Sitesi Trafiği Analizi:
Bir web sitesinin günlük ziyaretçilerini analiz etmek için, visits adlı bir tabloda visit_timestamp (timestamptz) ve visitor_ip (text) sütunları olduğunu varsayalım. Aşağıdaki sorgu, her gün için benzersiz ziyaretçilerin sayısını hesaplar:
SELECT date(visit_timestamp) AS visit_day, COUNT(DISTINCT visitor_ip) AS unique_visitors
FROM visits
GROUP BY visit_day
ORDER BY visit_day;
Vaka 2: Sosyal Medya Etkileşim Analizi:
Sosyal medya gönderilerinin günlük etkileşimlerini analiz etmek için, posts adlı bir tabloda post_date (timestamp) ve likes (integer) sütunları olduğunu varsayalım. Aşağıdaki sorgu, her gün için toplam beğeni sayısını hesaplar:
SELECT date(post_date) AS post_day, SUM(likes) AS total_likes
FROM posts
GROUP BY post_day
ORDER BY post_day;
Sonuç
PostgreSQL’de günlük veri gruplandırma, tarih ve zaman fonksiyonlarını doğru bir şekilde kullanarak oldukça kolay bir işlemdir. Bu makalede, temel kavramlardan ileri düzey tekniklere kadar geniş bir yelpazede bilgi sunuldu. Uygulamada karşılaşabileceğiniz senaryolar için gerçek dünya örnekleri ve performans optimizasyon ipuçları ile desteklenen bu rehber, PostgreSQL’i daha etkin kullanmanıza yardımcı olacaktır.
Sıkça Sorulan Sorular:
1. GROUP BY kullanmadan günlük veri gruplandırması mümkün müdür? Hayır, GROUP BY klauzu olmadan günlük verileri toplamak veya özetlemek mümkün değildir.
2. Çok sayıda sütun içeren bir tabloda günlük gruplandırma nasıl yapılır? GROUP BY klauzu, gruplandırma için kullanılan tüm sütunları içermelidir. Diğer sütunlar için toplama, ortalama veya sayma gibi agregasyon fonksiyonları kullanabilirsiniz.
3. Farklı zaman dilimlerinde kaydedilen verileri nasıl gruplandırabilirim? AT TIME ZONE fonksiyonu ile verileri ortak bir zaman dilimine dönüştürmeniz gerekir.
4. Günlük veri gruplandırmasında performans sorunlarıyla nasıl başa çıkabilirim? İndeksler oluşturmak, WHERE klauzu kullanmak, parçalı tablolar oluşturmak gibi optimizasyon teknikleri kullanabilirsiniz.
5. PostgreSQL’de tarih ve zaman fonksiyonları hakkında daha fazla bilgi nerede bulabilirim? PostgreSQL resmi dökümanlarına ve [fatihsoysal.com](https://fatihsoysal.com) adresindeki makalelere göz atabilirsiniz.
Yazar: Fatih Soysal