0Pricing
Coding Interview Prep · Ders

Pencere Sonucuna Göre Filtreleme

Bir pencere işlevine göre filtreleme yapmak için onu neden alt sorgu veya CTE içine almanız gerektiğini öğrenin.

Pencere Sonucuna Göre Filtreleme, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 4. 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.

Pencere İşlevini WHERE İçinde Neden Filtreleyemezsiniz

Sık karşılaşılan bir mülakat tuzağı: WHERE ROW_NUMBER() OVER (...) = 1 yazmak hata verir. Pencere işlevlerinin WHERE, GROUP BY veya HAVING içinde kullanılmasına izin verilmez.

Bunun nedeni mantıksal yürütme sırasıdır. Pencere işlevleri değerlendirilmeden önce satırları seçmek için WHERE çalışır. Pencere henüz hesaplanmamıştır; dolayısıyla bir filtrede kullanılamaz.

Yürütme Sırasının Açıklaması

Pencere işlevleri, FROM, WHERE, GROUP BY ve HAVING sonrasında, ancak son ORDER BY ve LIMIT işleminden önce gerçekleşen özel bir aşamada hesaplanır.

Bu nedenle WHERE çalıştığı anda sıra veya satır numarası henüz mevcut değildir. Buna göre filtreleme yapabilmek için önce pencerenin tamamlanmasına izin vermeli, ardından oluşturulan sütunu bir dış sorgu katmanında filtrelemelisiniz.

Alt Sorguyla Sarmalama Deseni

Standart çözüm şudur: pencere işlevini bir iç sorguda (türetilmiş tabloda) hesaplayın, sonuca bir takma ad verin ve ardından bu takma adı dış WHERE içinde filtreleyin.

Türetilmiş tablonun bir takma adı olmalıdır (burada t) — mülakat yapanlar bunu unutan adayları fark eder. Artık rn, dış sorgunun karşılaştırabileceği sıradan bir sütundur.

SELECT *
FROM (
  SELECT
    name, department, salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

CTE Deseni (Genellikle Daha Temiz)

Ortak Tablo İfadesi, aynı işi daha okunabilir bir yapıyla yapar. Sıralamayı bir WITH adımında tanımlayın, ardından ana sorguda filtreleyin.

İşlevsel olarak alt sorguyla aynıdır; ancak amaç yukarıdan aşağıya okunduğu için mülakat yapanlar canlı kodlamada genellikle CTE'leri tercih eder.

WITH ranked AS (
  SELECT
    name, department, salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
  FROM employees
)
SELECT name, department, salary
FROM ranked
WHERE rn = 1;

Uygulamalı Örnek: Grup Başına En Yüksek N

En sık karşılaşılan pencere problemi şudur: "Departman başına en yüksek maaşlı 3 çalışan." CTE içinde sıralayın, ardından dışarıda rn <= 3 satırlarını koruyun.

Sıralama işlevini eşitlik davranışına göre seçin: ROW_NUMBER departman başına tam 3 satırla sınırlar; sınırdaki eşitliklerin de dahil edilmesi gerekiyorsa RANK/DENSE_RANK kullanın.

WITH ranked AS (
  SELECT department, name, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rn
  FROM employees
)
SELECT department, name, salary
FROM ranked
WHERE rn <= 3
ORDER BY department, rn;

Uygulamalı Örnek: Birikimli Toplama Göre Filtreleme

Sarmalayıcı deseni yalnızca sıralamalar için kullanılmaz. Herhangi bir pencere sonucu — birikimli toplamlar, hareketli ortalamalar, LAG farkları — aynı şekilde filtrelenmelidir.

Burada birikimli bakiyeyi hesaplıyor, ardından yalnızca bu bakiyenin ilk kez 1000'i aştığı satırları koruyoruz. Filtre, pencere katmanının dışındadır.

WITH balances AS (
  SELECT
    account_id, txn_date, amount,
    SUM(amount) OVER (
      PARTITION BY account_id ORDER BY txn_date
    ) AS running_balance
  FROM transactions
)
SELECT *
FROM balances
WHERE running_balance > 1000;

QUALIFY: Bazı Veritabanlarındaki Kısayol

Snowflake, BigQuery, Teradata ve DuckDB, pencere sonuçlarını doğrudan filtreleyen bir QUALIFY yan tümcesi sunar — sarmalayıcı gerekmez. Bu yan tümce, pencere işlevlerinden sonra, tam da ihtiyaç duyduğunuz noktada çalışır.

Kapsamınızı göstermek için QUALIFY'den bahsedin; ancak bunun standart SQL'in bir parçası olmadığını ve PostgreSQL, MySQL ve SQL Server'da bulunmadığını belirtin. Bu sistemlerde alt sorgu/CTE sarmalayıcısına hâlâ ihtiyacınız vardır.

-- Snowflake / BigQuery only:
SELECT department, name, salary
FROM employees
QUALIFY ROW_NUMBER() OVER (
  PARTITION BY department ORDER BY salary DESC
) = 1;

HAVING ile Pencere Filtrelemesini Karıştırmayın

Adaylar bazen bir sırayı filtrelemek için HAVING kullanmayı dener. HAVING, GROUP BY toplamasından sonra grupları filtreler ve hâlâ pencere işlevlerinden önce çalışır; bu nedenle bir pencere sütununa da başvuramaz.

  • WHERE → gruplamadan ve pencerelerden önce satırları filtreler.
  • HAVING → toplu grupları filtreler, yine pencerelerden önce çalışır.
  • Bir pencereyi filtrelemek → dış sorgu (veya QUALIFY) gerektirir.

Ön Filtreyi Pencere Filtresiyle Birleştirme

Çoğu zaman hem pencereden önce hem de sonra filtreleme yaparsınız. Normal satır filtrelerini iç WHERE içinde uygulayın; böylece pencere yalnızca ilgili satırları görür. Ardından pencere sonucunu dış sorguda filtreleyin.

Bu örnekte önce etkin çalışanlarla sınırlandırıyor, sonra bunlar arasından her departmandaki en yüksek maaşlı çalışanı seçiyoruz. WHERE active ifadesini içeriye yerleştirmek, hangi satırların sıralanacağını değiştirir.

WITH ranked AS (
  SELECT department, name, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rn
  FROM employees
  WHERE is_active = true        -- pre-filter before ranking
)
SELECT * FROM ranked
WHERE rn = 1;                   -- post-filter on the window

Performans Notu

Mülakat yapanlar sarmalayıcının performansı düşürüp düşürmediğini sorabilir. Genellikle düşürmez: iyileştirici, alt sorguyu/CTE'yi tek bir planın parçası olarak ele alır ve pencereyi bir kez hesaplar. Sırf sarmaladığınız için ek tarama yapılmaz.

Bir istisna vardır: bazı motorlarda CTE bir optimizasyon engeli olabilir (gerçekleştirilmiş hâlde tutulabilir); bu nedenle yoğun kullanılan yollarda türetilmiş tablo veya QUALIFY daha iyi bir plan oluşturabilir. Önemliyse EXPLAIN ile profil çıkarın.

Yaygın Hatalar

Son kontrol listesi:

  • Pencere işlevini hiçbir zaman WHERE/HAVING içine koymayın — hata verir.
  • Türetilmiş tabloya her zaman takma ad verin; FROM içindeki adsız bir alt sorgu reddedilir.
  • Sorunun gerektirdiği eşitlik davranışına göre sıralama işlevini seçin.
  • QUALIFY'yi yalnızca desteklendiği yerlerde kullanın; aksi hâlde CTE/alt sorgu sarmalayıcısına geçin.

Hızlı Kontrol

Bir pencere işlevini filtrelemek neden sarmalayıcı gerektirir?

Özet: Pencere Sonuçlarını Filtreleme

Sıralama pencere işlevleri konusunu tamamladınız:

  • Pencere işlevleri WHERE/GROUP BY/HAVING sonrasında çalışır; bu nedenle onları bu bölümlerde filtreleyemezsiniz.
  • Pencereyi bir alt sorgu veya CTE içine alın (her zaman takma ad verin) ve sonucu dış sorguda filtreleyin.
  • Bu yaklaşım grup başına en yüksek N değerini, anahtar başına en son satırı ve birikimli toplam eşiklerini mümkün kılar.
  • QUALIFY, yalnızca Snowflake/BigQuery'de bulunan kullanışlı, standart dışı bir kısayoldur.

Artık mülakat yapanların en çok sınadığı eksiksiz sıralama araç setine sahipsiniz.

Sıkça Sorulan Sorular

“Pencere Sonucuna Göre Filtreleme” dersi ücretsiz mi?

Evet — “Pencere Sonucuna Göre Filtreleme” 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.

“Pencere Sonucuna Göre Filtreleme” dersinde ne öğreneceğim?

Bir pencere işlevine göre filtreleme yapmak için onu neden alt sorgu veya CTE içine almanız gerektiğini öğrenin. 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 4. dersidir.

“Pencere Sonucuna Göre Filtreleme” 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. OVER, PARTITION BY ve ORDER BY
  2. Benzersiz Sıralama için ROW_NUMBER
  3. Eşitliklerde RANK ve DENSE_RANK Karşılaştırması
  4. Pencere Sonucuna Göre Filtreleme
← Coding Interview Prep Sayfasına Dön