0Pricing
Coding Interview Prep · Ders

OVER, PARTITION BY ve ORDER BY

Bir pencere belirtiminin yapısını ve bölümlerin hesaplamayı nasıl sıfırladığını öğrenin.

OVER, PARTITION BY ve ORDER BY, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. 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.

Mülakatçılar Neden Pencere İşlevlerine Başvurur

Bir pencere işlevi, geçerli satırla ilişkili bir satır kümesi üzerinde hesaplama yapar; GROUP BY gibi satırları tek satıra indirmez. Mülakatçıların bu işlevleri sevmesinin nedeni tam olarak budur: her ayrıntı satırını korurken yanında bir toplama, sıralama veya kümülatif toplam da elde edersiniz.

  • GROUP BY her grup için bir satır döndürür.
  • Pencere işlevi her giriş satırını, ek olarak hesaplanmış bir sütunla birlikte döndürür.

Mülakatçı "her çalışanı ve departmanının ortalama maaşını aynı satırda gösterin" dediğinde, bir kendisiyle birleştirme yerine pencere işlevine başvurup başvurmadığınızı ölçer.

OVER Yan Tümcesinin Yapısı

Her pencere işlevinin ardından bir OVER (...) yan tümcesi gelir. Bu yan tümcenin üç isteğe bağlı bölümü vardır; bunları doğru adlandırmanız mülakatçıları etkiler:

  • PARTITION BY — satırları gruplara ayırır; işlev her grupta yeniden başlar.
  • ORDER BY — her bölüm içindeki satırları sıralar (sıralama ve kümülatif toplamlar için gereklidir).
  • çerçeve — hesaplamaya hangi satırların katılacağını sınırlar (ROWS/RANGE).

Boş bir OVER (), tüm sonuç kümesini tek bir bölüm olarak ele alır.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

Pencere ve Toplama: Aynı İşlev, Farklı Sonuç

Tam olarak aynı toplama işlevi, pencere işlevi olarak kullanıldığında farklı davranır. Aşağıdaki iki sorguyu kavramsal olarak karşılaştırın.

  • AVG(salary) ile GROUP BY department, departman başına bir satır döndürür.
  • AVG(salary) OVER (PARTITION BY department), her çalışanı döndürür ve her birine departman ortalamasını ekler.

Mülakat ipucu: pencere sürümünün GROUP BY gerektirmediğini ve ayrıntı satırlarını kaldırmadığını vurgulayın.

-- Aggregate: collapses
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

-- Window: preserves every row
SELECT department, name, AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

PARTITION BY: Hesaplamayı Sıfırlama

PARTITION BY, toplulaştırma işlevleri için GROUP BY neyse pencere işlevleri için odur; ancak satırları birleştirip tek satıra düşürmez. Her farklı bölüm değeri kendi bağımsız hesaplamasına sahip olur.

Örnekte satır numarası her departman için 1'den başlar. PARTITION BY olmadan numaralandırma tüm çalışanlar boyunca kesintisiz sürer.

  • Bir sütuna veya birkaç sütuna göre bölümlere ayırabilirsiniz.
  • PARTITION BY kullanılmaması, tek ve dev bir bölüm (tüm küme) anlamına gelir.
SELECT
  department,
  name,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

OVER İçinde ORDER BY

OVER içindeki ORDER BY, sorgunun sonundaki ORDER BY ile aynı değildir. Yalnızca işlevin üzerinde çalışacağı satırların her bölüm içindeki sırasını tanımlar.

  • Sıralama işlevleri (ROW_NUMBER, RANK) bunu gerektirir; sıralama yapacakları bir düzene ihtiyaç duyar.
  • Bir bölüm üzerindeki basit toplulaştırma işlevleri, kümülatif bir hesaplama istemediğiniz sürece buna ihtiyaç duymaz.

Mülakatlarda sık yapılan bir hata, pencerenin ORDER BY ifadesini çıktının gösterim sırasıyla karıştırmaktır.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS seniority_rank
FROM employees
ORDER BY name;  -- output order is independent of the window order

PARTITION BY ve ORDER BY Birlikte Kullanma

Klasik pencere sıralaması ikisini birleştirir: PARTITION BY grupları oluşturur, ardından ORDER BY her grubun içindeki sırayı belirler.

Aşağıdaki belirtimi şöyle okuyun: "Her departman içinde çalışanları maaşa göre azalan sırada sıralayın ve numaralandırın." Her departmandaki en yüksek maaşlı kişi 1 numaralı satırı alır.

Bu tek belirtim, grup başına ilk N değer dahil olmak üzere, en yaygın pencere işlevi mülakat sorularının temelini oluşturur.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_salary_rank
FROM employees;

ORDER BY Toplulaştırma İşlevinin Davranışını Değiştirir

İş görüşmecilerinin yokladığı ince bir nokta şudur: Bir toplulaştırma penceresine ORDER BY eklemek, örtük bir çerçevenin ("bölümün başından geçerli satıra kadar") devreye girmesi nedeniyle onu kümülatif bir hesaplamaya dönüştürür.

  • SUM(x) OVER (PARTITION BY g) → her satırda aynı grup toplamı.
  • SUM(x) OVER (PARTITION BY g ORDER BY d) → geçerli satıra kadar olan kümülatif toplam.

ORDER BY ifadesinin örtük olarak bir çerçeve eklediğini bilmek, orta seviye adayları başlangıç düzeyindeki adaylardan ayırır.

SELECT
  account_id,
  txn_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY account_id
    ORDER BY txn_date
  ) AS running_balance
FROM transactions;

Pencere İşlevlerinin Kullanılabildiği Yerler

Pencere işlevleri yalnızca SELECT listesinde ve ORDER BY yan tümcesinde bulunabilir. WHERE, GROUP BY veya HAVING içinde kullanılamazlar.

Bunun nedeni mantıksal yürütme sırasına dayanır: Pencere işlevleri, WHERE, GROUP BY ve HAVING çalıştırıldıktan sonra değerlendirilir. Pencere işlevi satırları görmeden önce satırlar zaten seçilmiştir.

Sıralamaya göre filtreleme yapmak için alt sorgu veya CTE kullanmanızın nedeni budur; bu konu sonraki bir derste ayrıntılı olarak ele alınacaktır.

-- This FAILS: window function in WHERE
-- SELECT name FROM employees
-- WHERE ROW_NUMBER() OVER (ORDER BY salary) = 1;

-- This works: window in SELECT, filter outside
SELECT * FROM (
  SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

Tek Sorguda Birden Çok Pencere İşlevi

Aynı SELECT içinde, her biri kendi belirtimine sahip olan veya ortak bir belirtimi paylaşan birkaç pencere işlevi kullanabilirsiniz. Veritabanı bunları bölümlere ayrılmış veriler üzerinde tek geçişte hesaplar.

Bu, mülakatlarda bir sıralama ile departman ortalamasını birlikte gerektiğinde kullanışlıdır. İki işlev aynı belirtimi paylaşıyorsa bazı SQL lehçeleri, tekrarı önlemek için bu belirtime bir WINDOW yan tümcesiyle ad vermenize izin verir.

SELECT
  name,
  department,
  salary,
  ROW_NUMBER() OVER w  AS rn,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);

Uygulamalı Örnek: Maaş ile Departman Ortalaması

Analistlerin sık karşılaştığı bir soru şudur: "Her çalışanı maaşı, departman ortalaması ve aradaki farkla birlikte listeleyin." İşin büyük kısmını tek bir pencere ifadesi yapar; aritmetik işlemler de kalanını tamamlar.

GROUP BY bulunmadığına ve her çalışan satırının korunduğuna dikkat edin. dept_avg, aynı departmandaki herkes için tekrarlanır; karşılaştırmayı satır satır mümkün kılan da tam olarak budur.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg
FROM employees
ORDER BY department, salary DESC;

İş Görüşmecilerinin Dikkat Ettiği Yaygın Hatalar

Pencere işlevleri gündeme geldiğinde şu tuzaklardan kaçının:

  • Pencere işlevini WHERE veya HAVING içine yerleştirmek — geçersizdir; alt sorgu kullanın.
  • Sıralama işlevinde ORDER BY kullanmayı unutmak — sonuçlar belirsiz hale gelir.
  • PARTITION BY ifadesinin satır sayısını azalttığını varsaymak — bunu hiçbir zaman yapmaz.
  • Pencerenin ORDER BY ifadesini son çıktı sırasıyla karıştırmak.
  • Toplulaştırma penceresine ORDER BY ekleyip bunun kümülatif toplama dönüştüğünü fark etmemek.

Hızlı Kontrol

Pencere belirtimini ne kadar kavradığınızı sınayın.

Özet: Pencere Belirtimi

Artık OVER (...) yapısını biliyorsunuz:

  • Pencere işlevleri, ilişkili satırlar üzerinden hesaplama yaparken her satırı korur.
  • PARTITION BY gruplandırır ve hesaplamayı sıfırlar; satırları hiçbir zaman kaldırmaz.
  • ORDER BY satırları bir bölüm içinde sıralar; sıralama işlevleri bunu gerektirir ve toplulaştırma işlevlerini kümülatif hesaplamalara dönüştürür.
  • Pencere işlevleri yalnızca SELECT ve ORDER BY içinde geçerlidir — WHERE/HAVING içinde asla kullanılamaz.

Sonraki adımda ROW_NUMBER ile belirli sıra numaraları atayacaksınız.

Sıkça Sorulan Sorular

“OVER, PARTITION BY ve ORDER BY” dersi ücretsiz mi?

Evet — “OVER, PARTITION BY ve ORDER BY” 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.

“OVER, PARTITION BY ve ORDER BY” dersinde ne öğreneceğim?

Bir pencere belirtiminin yapısını ve bölümlerin hesaplamayı nasıl sıfırladığını öğ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 1. dersidir.

“OVER, PARTITION BY ve ORDER BY” 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