0Pricing
SQL Interview Prep · Ders

Tarihleri Kırpma ve Gruplama

DATE_TRUNC ve eşdeğerleriyle haftaya, aya ve çeyreğe göre gruplama.

Tarihleri Kırpma ve Gruplama, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Tarihleri Gruplama Dilimlerine Ayırma Neden Sorulur

"Haftaya göre geliri göster" veya "aya göre aktif kullanıcıları göster" analist mülakatlarının temel sorularındandır. Ölçülen beceri, kesin zaman damgalarını satırların birlikte gruplanabilmesi için daha kaba bir gruplama dilimine dönüştürmektir.

Yeni başlayanların yaptığı hata, yalnızca ay numarasını çıkarmaktır; bu, farklı yıllardaki aynı ayları birleştirir. Profesyonel yanıt kırpmadır: her zaman damgasını ait olduğu dönemin başlangıcına eşlemektir.

  • Hafta, ay, çeyrek ve yıl gruplama dilimleri
  • DATE_TRUNC ve lehçelerdeki karşılıkları
  • Grafiklerin doğru hizalanması için doğru gruplama

DATE_TRUNC: Temel Araç

PostgreSQL'de DATE_TRUNC(unit, ts), birimden daha küçük tüm ayrıntıları sıfırlar. 'month' değerine göre kırpmak, herhangi bir Mart zaman damgasını 2024-03-01 00:00:00 değerine dönüştürür.

Döndürülen değer hâlâ bir zaman damgasıdır; bu nedenle kronolojik olarak sıralanır ve kusursuz biçimde gruplanır. Raporlama için en kullanışlı tarih işlevi budur.

SELECT DATE_TRUNC('month', TIMESTAMP '2024-03-17 14:30:00');
-- 2024-03-01 00:00:00

Geliri Aya Göre Gruplama

Bu, klasik uygulamalı örnektir. Zaman damgasını aya göre kırpın, ardından gruplayıp toplamını alın. Gruplama dilimi yılı içerdiği için Ocak 2023 ile Ocak 2024 birbirinden ayrı kalır.

Kırpılmış değere göre sıralama, grafik için hazır, düzenli bir zaman serisi oluşturur.

SELECT
  DATE_TRUNC('month', order_ts) AS month,
  SUM(amount)                   AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;

EXTRACT ve DATE_TRUNC Karşılaştırması

Mülakat yapanlar bu ayrımı doğrudan sorar. Her ikisi de dönem bilgisini çıkarır, ancak farklı sorulara yanıt verir.

  • EXTRACT(MONTH FROM ts), tüm yıllardaki Mart ayları için 3 sayısını döndürür; mevsimsellik analizi için kullanışlıdır.
  • DATE_TRUNC('month', ts), yılları birbirinden ayrı tutarak belirli ayın başlangıcını döndürür; zaman serileri için kullanışlıdır.

Aylık eğilim grafiği için EXTRACT(MONTH ...) ile gruplama yaparsanız yılları fark ettirmeden birbirine karıştırırsınız.

-- Seasonality: which month is busiest on average?
SELECT EXTRACT(MONTH FROM order_ts) AS month_num, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

-- Time series: month-by-month trend (years kept separate)
SELECT DATE_TRUNC('month', order_ts) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

Hafta Gruplama Dilimleri ve Pazartesi Sorusu

Haftalık gruplama, mülakat yapanların sormayı sevdiği ince bir ayrıntıyı gizler: Hafta ne zaman başlar? PostgreSQL'in DATE_TRUNC('week', ts) işlevi her zaman Pazartesi gününe (ISO haftalarına) göre hizalar.

İşletme haftaların Pazar günü başlamasını istiyorsa kaydırma yapmanız gerekir. Yaygın bir yöntem, tarihi bir gün geri almak, ardından kırpıp tekrar ileri kaydırmaktır.

-- ISO week (Monday start)
SELECT DATE_TRUNC('week', order_ts) AS iso_week FROM orders;

-- Sunday-start week
SELECT DATE_TRUNC('week', order_ts + INTERVAL '1 day') - INTERVAL '1 day'
  AS sunday_week
FROM orders;

Çeyrek Gruplama Dilimleri

Üç aylık raporlama, finansla ilişkili rollerde yaygındır. DATE_TRUNC('quarter', ts), herhangi bir zaman damgasını kendi çeyreğinin ilk gününe eşler: 1 Ocak, 1 Nisan, 1 Temmuz veya 1 Ekim.

Çeyreği bunun yerine bir sayı olarak etiketlemek için EXTRACT(QUARTER ...) işlevini yılla birleştirin.

SELECT
  DATE_TRUNC('quarter', order_ts)                  AS quarter_start,
  EXTRACT(YEAR FROM order_ts) || '-Q'
    || EXTRACT(QUARTER FROM order_ts)              AS quarter_label,
  SUM(amount)                                      AS revenue
FROM orders
GROUP BY 1, 2
ORDER BY 1;

MySQL'de DATE_TRUNC Yok

Lehçeler arası en sevilen sorulardan biri şudur: "MySQL'de DATE_TRUNC yok; ayları gruplama dilimlerine nasıl ayırırsınız?" Taşınabilir yanıt, tarihi istediğiniz ayrıntı düzeyine biçimlendirmektir.

  • DATE_FORMAT(ts, '%Y-%m-01'), ayın başlangıcını metin/tarih olarak verir.
  • DATE_FORMAT(ts, '%Y-%m'), 2024-03 gibi sıralanabilir bir dize anahtarı verir.

Hafta için MySQL, haftanın başlangıcını belirleyen bir kip bağımsız değişkeniyle YEARWEEK() işlevini sunar.

-- MySQL month bucket
SELECT DATE_FORMAT(order_ts, '%Y-%m-01') AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;

SQL Server'da Gruplama Dilimlerine Ayırma

SQL Server'da geçmişte doğrudan bir kırpma işlevi yoktu; bu nedenle adaylar DATEFROMPARTS veya DATEADD/DATEDIFF kalıbını kullanırdı. Modern sürümlerde (2022+) DATETRUNC eklendi.

"Başlangıç anından bu yana birimleri sayıp sonra bunları yeniden eklemek" şeklindeki klasik kalıp her sürümde çalışır ve bilinmesi değerlidir.

-- Portable SQL Server month truncation
SELECT DATEADD(month, DATEDIFF(month, 0, order_ts), 0) AS month_start
FROM orders;

-- SQL Server 2022+
SELECT DATETRUNC(month, order_ts) AS month_start FROM orders;

Zaman Serisindeki Boşlukları Doldurma

Tek başına kırpma, satır sayısı sıfır olan dönemleri yok sayar: sipariş olmayan bir ay hiç görünmez. Mülakat yapanlar bunu fark edip etmediğinizi sınar.

Çözüm, eksiksiz bir dönem dizisi oluşturup verileri bunun üzerine LEFT JOIN ile bağlamaktır. PostgreSQL'de generate_series bu diziyi oluşturur.

SELECT
  cal.month,
  COALESCE(SUM(o.amount), 0) AS revenue
FROM generate_series(DATE '2024-01-01', DATE '2024-12-01',
                      INTERVAL '1 month') AS cal(month)
LEFT JOIN orders o
  ON DATE_TRUNC('month', o.order_ts) = cal.month
GROUP BY cal.month
ORDER BY cal.month;

Daha Derin Bir Örnek: Haftalık Aktif Kullanıcılar

Gruplama dilimlerine ayırmayı tekrarsız sayımla birleştirin. "Haftalık aktif kullanıcılar", gerçek bir ürün analitiği gereksinimi olan, her haftalık gruplama dilimindeki tekrarsız kullanıcılar anlamına gelir.

Etkinlik zaman damgasını haftaya göre kırpın, ardından COUNT(DISTINCT user_id) kullanın. Sıfır etkinlikli haftaları göstermek için bir hafta dizisini verilerle birleştireceğinizi belirtmeniz ek puan kazandırır.

SELECT
  DATE_TRUNC('week', event_ts) AS week,
  COUNT(DISTINCT user_id)      AS wau
FROM events
GROUP BY 1
ORDER BY 1;

Dizinlenmiş Sütunda Gruplama Dilimlerine Ayırma

Belirtmeniz gereken bir performans uyarısı var: Tarih sütununu bir DATE_TRUNC işleviyle WHERE koşulunun içinde sarmalamak, planlayıcının bu sütundaki bir dizini kullanmasını engelleyebilir.

GROUP BY içinde kullanılması sorun değildir; ancak filtreleme yaparken ham sütunu hesaplanan sınırlarla karşılaştırın. Daha önce ele aldığımız yarı açık kalıp burada da geçerlidir.

-- Avoid in WHERE: DATE_TRUNC('month', order_ts) = '2024-03-01'
-- Prefer:
SELECT * FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

Kısa Kontrol

Yılları birbirinden ayrı tutan aylık eğilim grafiği için doğru aracı seçin.

Özet: Tarihleri Kırpma ve Gruplama Dilimlerine Ayırma

Hatırlanması gerekenler:

  • DATE_TRUNC(unit, ts), zaman damgalarını bir dönem başlangıcına eşler ve yılları birbirinden ayrı tutar; zaman serileri için doğru araçtır.
  • EXTRACT, yalın bir sayı döndürür; mevsimsellik için iyidir, ancak yılları birleştirir.
  • PostgreSQL haftaları Pazartesi günü başlar; Pazar gününe ihtiyacınız varsa kaydırma yapın.
  • MySQL'de DATE_FORMAT kullanılır; eski SQL Server sürümlerinde DATEADD(DATEDIFF(...)) kalıbı kullanılır; 2022 ve sonraki sürümlerde DATETRUNC vardır.
  • Boş dönemleri göstermek için oluşturulmuş bir tarih dizisi + LEFT JOIN kullanın ve dizin kullanımını korumak için DATE_TRUNC işlevini WHERE dışında tutun.

Sıkça Sorulan Sorular

“Tarihleri Kırpma ve Gruplama” dersi ücretsiz mi?

Evet — “Tarihleri Kırpma ve Gruplama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Tarihleri Kırpma ve Gruplama” dersinde ne öğreneceğim?

DATE_TRUNC ve eşdeğerleriyle haftaya, aya ve çeyreğe göre gruplama. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Tarihleri Kırpma ve Gruplama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tarih Aritmetiği ve Aralıklar
  2. Tarihleri Kırpma ve Gruplama
  3. Dizeleri Ayrıştırma ve Biçimlendirme
  4. Saat Dilimleri ve Zaman Damgaları
← SQL Interview Prep Sayfasına Dön