0Pricing
Coding Interview Prep · Ders

FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları

Sınır değerlerini almayı ve LAST_VALUE çerçevesindeki önemli ayrıntıyı öğrenin.

FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları, 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.

Sınır Değerlerini Çekme

Mülakatçılar şöyle sorar: "Her satırı, grubundaki ilk ve son değerle birlikte gösterin." Kullanıcı başına ilk giriş tarihini veya bir bölümdeki en güncel fiyatı her ayrıntı satırının yanında göstermeyi düşünün.

İşlevler FIRST_VALUE ve LAST_VALUE'dur. Basit görünürler; ancak LAST_VALUE, SQL'deki en ünlü pencere çerçevesi tuzaklarından birini gizler. Bu derste her ikisini de güvenilir biçimde kullanmayı öğreneceksiniz.

FIRST_VALUE Temelleri

FIRST_VALUE(col), pencerenin ilk satırındaki col değerini döndürür ve bunu her satıra ekler. Tarihe göre sıralandığında, bölümündeki en erken değeri her satıra verir.

Varsayılan çerçeve bölümün ilk satırından başladığı için FIRST_VALUE genellikle insanların beklediği şekilde davranır.

SELECT
  user_id,
  login_date,
  FIRST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
  ) AS first_login
FROM logins;

Varsayılan Pencere Çerçevesi

İşte asıl önemli nokta. Bir pencereye ORDER BY eklediğinizde varsayılan çerçeve RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW olur.

Bu, her satır için pencerenin yalnızca bölümlemenin başlangıcından geçerli satıra kadar uzandığı, sona kadar uzanmadığı anlamına gelir. FIRST_VALUE bundan etkilenmez (ilk satır her zaman aralıktadır), ancak LAST_VALUE bundan ciddi biçimde etkilenir.

LAST_VALUE Tuzağı

Yalnızca bir ORDER BY ile LAST_VALUE çalıştırdığınızda, adayların çoğu bölümlemenin son değerini bekler. Oysa çerçevenin geçerli satırda sona ermesi nedeniyle, "çerçevedeki son değer" yalnızca geçerli satırın kendi değeridir.

Dolayısıyla bu sorgu her satırda doğrudan login_date değerini döndürür ve bozuk görünebilir. Bu, pencere işlevlerinde en sık sorulan tek tuzaktır.

SELECT
  user_id,
  login_date,
  LAST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
  ) AS wrong_last_login
FROM logins;

LAST_VALUE İşlevini Tam Çerçeveyle Düzeltme

Çözüm, çerçeveyi tüm bölümlemeyi kapsayacak şekilde genişletmektir: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Artık her satır için pencere tüm bölümlemeyi kapsar ve LAST_VALUE gerçek son değeri döndürür. Bir mülakatta bu düzeltmeyi açıkça belirtin; bu, yalnızca işlev adlarını değil, çerçeveleri de anladığınızı kanıtlar.

SELECT
  user_id,
  login_date,
  LAST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
    ROWS BETWEEN UNBOUNDED PRECEDING
             AND UNBOUNDED FOLLOWING
  ) AS last_login
FROM logins;

Daha Kolay Bir Seçenek

Birçok mühendis çerçeveyi tamamen devre dışı bırakır: son değeri almak için sıralama düzenini tersine çevirerek FIRST_VALUE kullanır.

FIRST_VALUE(login_date) OVER (... ORDER BY login_date DESC) herhangi bir çerçeve yan tümcesine gerek kalmadan en son tarihi döndürür. Bahsetmek için temiz ve akılda kalıcı bir püf noktasıdır.

SELECT
  user_id,
  login_date,
  FIRST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date DESC
  ) AS last_login
FROM logins;

Çerçevelerde ROWS ve RANGE Karşılaştırması

Çerçevelerin iki çeşidi vardır. ROWS fiziksel satırları sayar; RANGE eşit ORDER BY değerlerine göre gruplar (eş satırlar).

Varsayılan çerçeve RANGE kullanır; bu nedenle aynı sıralama değerlerine sahip satırlar aynı çerçeve sınırını paylaşır. LAST_VALUE düzeltmeleri için, eşit değerlerde sürprizlerle karşılaşmamak üzere açıkça ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING kullanmayı tercih edin.

Keyfi Konumlar için NTH_VALUE

İlk ve son değerlerin ötesinde, NTH_VALUE(col, n) çerçeve içindeki n. konumdaki değeri alır; örneğin ikinci en yüksek fiyatı.

LAST_VALUE ile aynı çerçeve kurallarına uyar. Bu nedenle, yalnızca geçerli satıra kadar olan kısmı değil, tüm bölümleme genelindeki n. değeri istediğinizde bunu tam çerçeveyle birlikte kullanın.

SELECT
  product_id,
  price,
  NTH_VALUE(price, 2) OVER (
    PARTITION BY product_id
    ORDER BY price DESC
    ROWS BETWEEN UNBOUNDED PRECEDING
             AND UNBOUNDED FOLLOWING
  ) AS second_highest_price
FROM prices;

Uygulamalı Örnek: İlk ve Son Değer Birlikte

Yaygın bir rapor, her işlemin yanında müşterinin ilk ve son işlem tutarını gösterir. Her iki işlevi de birleştirirken LAST_VALUE için açık çerçeveyi unutmayın.

Artık her satırda, bir fark hesaplama veya etiketleme adımına hazır, tüm bölümlemenin ilk ve son değerleri bulunur.

SELECT
  customer_id,
  txn_date,
  amount,
  FIRST_VALUE(amount) OVER w AS first_amt,
  LAST_VALUE(amount) OVER w AS last_amt
FROM transactions
WINDOW w AS (
  PARTITION BY customer_id
  ORDER BY txn_date
  ROWS BETWEEN UNBOUNDED PRECEDING
           AND UNBOUNDED FOLLOWING
);

Adlandırılmış Pencereler DRY İlkesini Korur

Önceki sorgunun bir WINDOW w AS (...) yan tümcesi kullandığına ve OVER w ifadesine iki kez başvurduğuna dikkat edin. Pencereyi bir kez tanımlamak, uzun bir çerçeve belirtimini tekrarlamaktan kaçınır ve iki işlevin birbirinden sapmasını önler.

Çoğu büyük veritabanı adlandırılmış pencereleri destekler. Birden çok sütun aynı pencereyi paylaştığında bunu kullanmak, mülakatçıların takdir ettiği zarif bir ayrıntıdır.

Uygulamalı Örnek: İlk Değerden Son Değere Fark

Sık gelen bir devam sorusu, müşterinin ilk işleminden son işlemine kadar olan değişimdir. Her satırda her iki sınır değeri bulunduğunda bunları birbirinden çıkarın; gerekirse müşteri başına tek satıra indirgemek için yinelenenleri kaldırın.

Bu, tam çerçeve düzeltmesini basit aritmetik ile birleştirir; mülakatçıların temizce kurulmuş uçtan uca bir yanıtta görmek istediği türden bir yaklaşımdır.

SELECT DISTINCT
  customer_id,
  LAST_VALUE(amount) OVER w - FIRST_VALUE(amount) OVER w AS first_to_last_delta
FROM transactions
WINDOW w AS (
  PARTITION BY customer_id
  ORDER BY txn_date
  ROWS BETWEEN UNBOUNDED PRECEDING
           AND UNBOUNDED FOLLOWING
);

Kısa Kontrol

Klasik LAST_VALUE tuzağı.

Özet

Sınır değeri işlevleri çerçeveye bağlıdır:

  • FIRST_VALUE varsayılan çerçevede çalışır; LAST_VALUE ise çalışmaz.
  • Varsayılan çerçeve geçerli satırda sona erer; bu nedenle LAST_VALUE işlevini ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ile düzeltin veya sıralamayı ters çevirip FIRST_VALUE kullanın.
  • NTH_VALUE(col, n) isteğe bağlı konumları alır; adlandırılmış pencereler çok sütunlu belirtimleri DRY tutar.

Bu, LAG, LEAD, NTILE ve sınır değeri araç setini tamamlar.

Sıkça Sorulan Sorular

“FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları” dersi ücretsiz mi?

Evet — “FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları” 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.

“FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları” dersinde ne öğreneceğim?

Sınır değerlerini almayı ve LAST_VALUE çerçevesindeki önemli ayrıntıyı öğ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.

“FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları” 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. Bitişik Satırlar için LAG ve LEAD
  2. Dönemden Döneme Değişim
  3. Gruplara Ayırma için NTILE
  4. FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları
← Coding Interview Prep Sayfasına Dön