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_VALUEvarsayılan çerçevede çalışır;LAST_VALUEise çalışmaz.- Varsayılan çerçeve geçerli satırda sona erer; bu nedenle
LAST_VALUEişleviniROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGile düzeltin veya sıralamayı ters çeviripFIRST_VALUEkullanı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
- Bitişik Satırlar için LAG ve LEAD
- Dönemden Döneme Değişim
- Gruplara Ayırma için NTILE
- FIRST_VALUE, LAST_VALUE ve Çerçeve Sınırları