0Pricing
Coding Interview Prep · Ders

Sayı ve Tarih Serileri Oluşturma

Boşlukları doldurmak ve takvimler oluşturmak için özyinelemeyle diziler üretin.

Sayı ve Tarih Serileri Oluşturma, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. 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, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Hiyerarşi Olmadan Özyineleme

Özyinelemeli CTE'ler yalnızca ağaçlar için kullanılmaz. İkinci önemli kullanım alanı diziler oluşturmaktır: bir sayı dizisi veya bir aralıktaki her tarih. Mülakatçılar bunu, boşluk doldurma gerektiren problemlerde sorar — yani hiçbir tabloda bulunmayan satırları üretmeniz gerektiğinde.

Klasik soru şudur: "Ay boyunca günlük satışları, satışın sıfır olduğu günler de dahil olmak üzere gösterin." Önce tüm günleri üretmeden eksik bir günü gösteremezsiniz.

Basit Bir Sayı Dizisi

Başlangıç üyesi ilk sayıyı oluşturur; özyinelemeli üye her yinelemede bir ekler; özyinelemeli üyedeki bir WHERE işlemi bunu durdurur. Bu işlem 1'den 10'a kadar sayıları üretir.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;

Sonlandırma Koşulu

Organizasyon şemasının aksine, sayı dizisinin durmak için doğal bir yaprak düğümü yoktur — sayıyı sonsuza kadar artırabilirsiniz. Bu nedenle özyinelemeli üyeye açık bir durdurma koşulu eklemelisiniz: WHERE n < 10.

n değeri 10'a ulaştığında, sonraki yinelemenin WHERE işlemi tek aday satırı filtreler, özyinelemeli üye hiçbir şey döndürmez ve özyineleme durur. Bu korumayı unutmak, mülakatlarda kontrolden çıkan özyinelemenin bir numaralı nedenidir.

Aralığı Parametreleştirme

Sınır değerini bir değerden veya değişkenden alarak diziyi esnek hâle getirin. Burada, sağlanan N değerine kadar 1'den N'e kadar sayılar üretilir. Aynı yapı, 0 tabanlı veya adımlı diziler de üretir — yalnızca başlangıç değerini ve artışı değiştirin.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums;  -- odd numbers 1,3,5,...,99

Tarih Dizisi Oluşturma

Tamsayı aritmetiği yerine tarih aritmetiği kullandığınızda bir takvim elde edersiniz. Başlangıç üyesi başlangıç tarihidir; özyinelemeli üye, bitiş tarihini geçene kadar bir gün ekler.

Bir gün ekleme söz dizimi diyalekte göre değişir — bu Postgres tarzı biçimde bir aralık kullanılır.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day'
    FROM cal
    WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;

LEFT JOIN ile Boşlukları Doldurma

Şimdi takvimi gerçek verilerle birleştirin. Her günü üretin, ardından eksik günlerin NULL olarak görünmesi için satış tablosuna LEFT JOIN uygulayın ve bu değeri COALESCE ile 0'a dönüştürün.

Bu iki adımlı yapı — omurgayı oluşturmak, ardından olgulara sol birleştirme uygulamak — tüm boşluk doldurma yanıtlarının temelidir.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day' FROM cal
    WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;

Aylık ve Haftalık Omurgalar

Daha geniş aralıklı takvimler oluşturmak için artışı değiştirin. Aylık bir omurga için INTERVAL '1 month', haftalık bir omurga için INTERVAL '7 day' ekleyin. Bu, mülakatçı boş ayları da içeren aylık bir rapor istediğinde kullanışlıdır.

WITH RECURSIVE months AS (
    SELECT DATE '2024-01-01' AS m
    UNION ALL
    SELECT m + INTERVAL '1 month' FROM months
    WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;

Diyalektlerde Tarih Aritmetiği Farkları

Tarih aritmetiği, bu sorguların en az taşınabilir bölümüdür. Farklı biçimleri bilin:

  • Postgres: d + INTERVAL '1 day'.
  • MySQL: DATE_ADD(d, INTERVAL 1 DAY).
  • SQL Server: DATEADD(DAY, 1, d).
  • SQLite: date(d, '+1 day').

Özyineleme yapısının aynı olduğunu ve yalnızca tarih işlevinin değiştiğini belirtmek, diyalekt farklarının farkında olduğunuzu gösteren güçlü bir yanıttır.

Özyineleme ve Seri Üretiminin Karşılaştırılması

Postgres, özyineleme kullanmadan sayı veya tarih üreten yerleşik bir generate_series() işlevi sunar; bu işlev daha hızlı ve daha anlaşılırdır:

SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');

Mülakatçının veritabanı bunu destekliyorsa onu tercih edin. Ancak birçok motorun (MySQL ve yeni sürümlerinden önceki SQL Server dahil) böyle bir işlevi yoktur — özyinelemeli CTE tam da bu durumda taşınabilir bir geri dönüş seçeneğidir.

Özyineleme Sınırına Dikkat Edin

Büyük bir dizi oluşturmak, motorun özyineleme sınırına takılabilir. SQL Server varsayılan olarak MAXRECURSION 100 kullanır; bu nedenle sınırı kaldırmak için sonuna OPTION (MAXRECURSION 0) eklemezseniz 365 günlük bir takvim başarısız olur.

Postgres'te sabit bir sınır yoktur; ancak yanlış bir koşula sahip kontrolden çıkan bir dizi, belleği tüketene kadar çalışabilir. Ölçeği büyütmeden önce sonlandırma koşulunuzun doğru olduğunu mutlaka doğrulayın.

-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);

Diziye CROSS JOIN Uygulama

Oluşturulan bir dizi çoğu zaman yalnızca bir bileşendir. Bir sayı CTE'sine sahip olduğunuzda, satırları genişletmek veya çoğaltmak için ona CROSS JOIN uygulayabilirsiniz — örneğin her sipariş satırını miktarı kadar tekrarlamak veya bir tarih aralığını müşteri başına genişletmek için.

Özyinelemenin yalnızca nihai bir yanıt değil, yeniden kullanılabilir bir yapı taşı ürettiğini kavramak, özenle hazırlanmış bir mülakat yanıtını ezberlenmiş bir yanıttan ayırır.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;

Hızlı Kontrol

Bir sayı/tarih dizisinde durdurma koşulu neden kritiktir?

Özet

Özyineleme, hiçbir tabloda bulunmayan satırları üretebilir:

  • İlk değeri başlangıç üyesinde oluşturun, özyinelemeli üyede artırın.
  • Her zaman açık bir sonlandırma koşulu ekleyin — dizilerin doğal bir sonu yoktur.
  • Bir tarih/sayı omurgası oluşturun, ardından boşluk doldurmak için olgulara LEFT JOIN uygulayın ve COALESCE kullanın.
  • Kullanılabildiğinde generate_series işlevini tercih edin; SQL Server'da MAXRECURSION sınırına dikkat edin.

Sırada: özyinelemenin kontrolden çıkmasını önleyen güvenlik teknikleri.

Sıkça Sorulan Sorular

“Sayı ve Tarih Serileri Oluşturma” dersi ücretsiz mi?

Evet — “Sayı ve Tarih Serileri Oluşturma” 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 Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Sayı ve Tarih Serileri Oluşturma” dersinde ne öğreneceğim?

Boşlukları doldurmak ve takvimler oluşturmak için özyinelemeyle diziler üretin. Coding 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.

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

Önceden deneyim gerekmez. CoddyKit'te Coding 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 3. dersidir.

“Sayı ve Tarih Serileri Oluşturma” 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 Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding 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. Çapa ve Özyinelemeli Üyeler
  2. Kuruluş Şemasını Dolaşma
  3. Sayı ve Tarih Serileri Oluşturma
  4. Sonsuz Özyinelemeden Kaçınma
← Coding Interview Prep Sayfasına Dön