Sql İle Belirli Tarih Aralığında Veri Gruplandırma İşlemi Nasıl Yapılır?

Sql İle Belirli Tarih Aralığında Veri Gruplandırma İşlemi Nasıl Yapılır?
Sql İle Belirli Tarih Aralığında Veri Gruplandırma İşlemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Uygulamaların çalışması için herhangi bir SQL veritabanı yönetim sistemine (DBMS) erişiminiz olması yeterlidir. Örneklerde kullanılan sözdizimi genel SQL standartlarına uygun olsa da, bazı fonksiyonlar veritabanı motoruna göre küçük farklılıklar gösterebilir. Çalışmalarınızı test etmek için aşağıdaki araçlardan birini kullanabilirsiniz:

  • PostgreSQL 16+: Gelişmiş tarih ve zaman fonksiyonları için en ideal ortamdır.
  • MySQL 8.0+: Yaygın kullanımı nedeniyle standart gruplandırma örnekleri için uygundur.
  • SQL Server (T-SQL): Kurumsal projelerde sıkça tercih edilen güçlü bir alternatiftir.

Veritabanınızda satislar adında, satis_tarihi (DATETIME) ve tutar (DECIMAL) sütunlarını içeren bir tablonuzun olduğunu varsayıyoruz. Bu tablo üzerinde yapacağımız tüm işlemler, gerçek zamanlı verilerle çalışıyormuşsunuz gibi kurgulanmıştır.

Tarih Aralıklarını Filtreleme ve Temel Mantık

Gruplandırma yapmadan önce, verileri belirli bir tarih aralığına kısıtlamanız gerekir. SQL'de WHERE yan tümcesi, gruplandırma öncesinde veriyi filtrelemek için kullanılır. Eğer filtrelemeyi GROUP BY sonrasında yaparsanız, veritabanı gereksiz verileri işleyerek performans kaybına neden olur.

-- 2026 yılının ilk çeyreğindeki satışları filtreleme
SELECT * 
FROM satislar 
WHERE satis_tarihi >= '2026-01-01' AND satis_tarihi  10000;

HAVING, gruplama işlemi tamamlandıktan sonra çalışan bir filtreleme mekanizmasıdır. WHERE ise gruplama yapılmadan önce ham veriyi filtreler. Bu ayrımı bilmek, karmaşık raporlama sorgularında hata yapmanızı engeller.

Kritik Uyarı: SQL sorgularınızda kullanıcıdan gelen verileri doğrudan sorgu içine yerleştirmeyin. SQL Injection saldırılarına karşı her zaman "Parametrize Sorgular" veya "Prepared Statements" kullanın. Kullanıcı girdilerini filtrelemek için veritabanı sürücünüzün sunduğu güvenli yöntemleri tercih edin.

Performans İpuçları ve İndeksleme

Tarih aralığında gruplandırma yaparken tablonuzda milyonlarca satır varsa, sorgu süresi ciddi oranda uzayabilir. Bunu önlemek için tarih sütununa mutlaka bir INDEX (dizin) eklemelisiniz. İndeksler, veritabanının veriyi taramak yerine doğrudan ilgili aralığa gitmesini sağlar.

-- Tarih sütununa indeks ekleme
CREATE INDEX idx_satis_tarihi ON satislar(satis_tarihi);

İndeksleme yaparken, sütun üzerinde fonksiyon kullanmamaya özen gösterin. Örneğin, WHERE DATE(satis_tarihi) = '2026-01-01' yerine WHERE satis_tarihi >= '2026-01-01' AND satis_tarihi < '2026-01-02' kullanmak, indeksin kullanılmasını sağlar. Fonksiyon kullanımı, indeksin devre dışı kalmasına neden olur.

Sıkça Sorulan Sorular

Hangi durumlarda WHERE, hangi durumlarda HAVING kullanılır?

Veri gruplanmadan önce satır bazlı bir kısıtlama yapmak istiyorsanız WHERE, gruplanmış veri üzerinde (örneğin toplam satış miktarı üzerinden) bir kısıtlama yapmak istiyorsanız HAVING kullanmalısınız.

Tarih aralığı sorgularında saat farkı nasıl yönetilir?

Tarih aralığı sorgularında saatleri dahil etmek için >= ve = '2026-01-01 00:00:00' AND tarih < '2026-01-02 00:00:00' mantığı kullanılır.

Boş (NULL) tarih değerleri gruplandırmayı nasıl etkiler?

GROUP BY işlemi sırasında NULL değerler ayrı bir grup olarak ele alınır. Eğer bu verilerin analizinizi bozmasını istemiyorsanız, sorgunuza WHERE satis_tarihi IS NOT NULL ekleyerek bu kayıtları hariç tutabilirsiniz.

Performans için tarih sütununu nasıl optimize edebilirim?

Tarih sütunlarına B-Tree tipi indeksler eklemek en yaygın ve etkili yöntemdir. Ayrıca, çok büyük tablolarda "Partitioning" (bölümleme) yöntemini kullanarak verileri yıllara veya aylara göre fiziksel olarak ayırabilirsiniz.

SQL'de haftalık gruplandırma yapabilir miyim?

Evet, çoğu veritabanı sistemi WEEK() veya EXTRACT(WEEK FROM tarih) fonksiyonlarını destekler. Bu fonksiyonlarla verileri yılın haftalarına göre kolayca gruplandırabilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce sorgularınızı mutlaka bir geliştirme veya test ortamında doğrulayın. Veritabanı üzerinde yapılacak her türlü toplu işlem (UPDATE, DELETE gibi) öncesinde yedek almayı ihmal etmeyin.

İleri Seviye Senaryo: Dinamik Zaman Dilimi ve Dilimleme (Bucketing)

Veri analizi süreçlerinde bazen standart gün, hafta veya ay gruplandırmaları yeterli olmaz. Özellikle finansal raporlama veya sistem log analizi gibi durumlarda, veriyi 15 dakikalık veya 4 saatlik "dilimlere" (buckets) ayırmanız gerekebilir. Bu işlem, SQL'de matematiksel mod alma veya tarih fonksiyonlarını yuvarlama mantığıyla gerçekleştirilir.

Aşağıdaki örnekte, bir e-ticaret veritabanında siparişleri 4 saatlik zaman dilimlerine ayırarak gruplandıran bir sorgu yapısı yer almaktadır:

SELECT 
    DATE(siparis_tarihi) AS gun,
    FLOOR(HOUR(siparis_tarihi) / 4) * 4 AS zaman_dilimi_baslangici,
    COUNT(*) AS toplam_siparis
FROM siparisler
WHERE siparis_tarihi BETWEEN '2023-10-01' AND '2023-10-31'
GROUP BY gun, zaman_dilimi_baslangici
ORDER BY gun, zaman_dilimi_baslangici;

Bu yöntem, özellikle yoğun trafik alan sistemlerde "yoğun saatleri" tespit etmek için oldukça etkilidir. FLOOR(HOUR(tarih) / 4) ifadesi, 24 saati 4'er saatlik 6 farklı dilime böler ve gruplandırma işlemini bu dilimler üzerinden gerçekleştirir.

Hata Ayıklama ve Sorgu Optimizasyon Stratejileri

Karmaşık tarih aralığı sorgularında sıkça karşılaşılan hatalardan biri, veritabanının tarih formatı ile uygulama katmanından gelen formatın uyuşmamasıdır. Sorgunuz beklediğiniz sonucu döndürmüyorsa veya performans sorunları yaşıyorsa şu kontrol listesini uygulayın:

  • Implicit Conversion (Örtük Dönüşüm): Tarih sütununuz üzerinde YEAR(tarih) gibi fonksiyonlar kullanmak, veritabanının ilgili sütundaki indeksleri görmezden gelmesine neden olur. Bunun yerine aralık sorgularını tarih >= '2023-01-01' AND tarih < '2023-02-01' şeklinde yazın.
  • Zaman Dilimi (Timezone) Farklılıkları: Sunucu saati ile uygulama saatinin farklı olması, özellikle sınır günlerinde (gece 00:00 civarı) veri kaybına veya fazlalığına yol açar. Her zaman UTC formatında saklama yapıp, gösterim anında yerel saate çevirme prensibini benimseyin.
  • Explain Plan Analizi: Sorgunuzun yavaş çalıştığını düşünüyorsanız, sorgunun başına EXPLAIN komutunu ekleyerek veritabanının veriye nasıl eriştiğini inceleyin.
-- İndeks dostu olmayan (YAVAŞ) yöntem
SELECT * FROM satislar WHERE MONTH(tarih) = 5;

-- İndeks dostu olan (HIZLI) yöntem
SELECT * FROM satislar 
WHERE tarih >= '2023-05-01' AND tarih < '2023-06-01';

Bu yaklaşım, veritabanı motorunun B-Tree indekslerini tam kapasiteyle kullanmasını sağlar. Özellikle milyonlarca satırlık tablolarda bu küçük değişiklik, sorgu süresini saniyelerden milisaniyelere indirebilir.

Profesyonel Not: Tarih aralığı sorgularında BETWEEN operatörü yerine >= ve

Sonuç

SQL ile belirli bir tarih aralığında veri gruplandırma, veritabanı yönetiminin temel taşlarından biridir. Doğru fonksiyonları kullanmak, WHERE ve HAVING arasındaki farkı anlamak ve performans için indekslemeye dikkat etmek, profesyonel bir yazılımcının sahip olması gereken yetkinliklerdir. Bu adımları takip ederek artık kendi raporlama sorgularınızı güvenle oluşturabilirsiniz.

Bir sonraki adım olarak, gruplandırdığınız verileri görselleştirmek için bir BI (İş Zekası) aracı veya uygulama tarafında (Python/Pandas veya JavaScript/Chart.js) nasıl işleyebileceğinizi araştırmanızı öneririm. Verinin sadece gruplanması değil, doğru şekilde sunulması da analiz sürecinin ayrılmaz bir parçasıdır.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Hobi projeleri ve kendin yap (DIY) içerikleri üzerine uzmanlaşmış bir içerik editörüyüm. Adım adım rehberlerle okuyucuların teknik becerilerini geliştirmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz