Bitişik Satırlar için LAG ve LEAD
SELF JOIN kullanmadan önceki ve sonraki satır değerlerine erişin.
Bitişik Satırlar için LAG ve LEAD, CoddyKit'te ücretsiz bir SQL 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, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.
Mülakat Yapanların Sorduğu Soru
Analist mülakatlarında en sık sorulan sorulardan biri şudur: "Her satırı kendi kendine birleştirme yapmadan önceki satırla karşılaştırın." Aydan aya geliri, bir kullanıcının önceki oturum açmasını veya bir dizideki sonraki olayı düşünün.
En temiz yanıt LAG ve LEAD pencere işlevleridir. Bu işlevler, her ayrıntı satırını korurken bir satırın komşu satırın değerine bakmasını sağlar. Bu derste, bitişik satırlar arasında nasıl gezindiklerine ilişkin kesin bir zihinsel model oluşturacaksınız.
LAG ve LEAD Ne Yapar
LAG(col), col değerini önceki satırdan döndürür. LEAD(col) ise değeri sonraki satırdan döndürür. "Önceki" ve "sonraki" kavramları tamamen OVER yan tümcesindeki ORDER BY tarafından belirlenir.
- LAG geriye bakar.
- LEAD ileriye bakar.
Her ikisi de ofset pencere işlevidir: satırları hiçbir zaman birleştirmez, yalnızca bir komşunun değerini geçerli satıra ekler.
Temel LAG Sözdizimi
İşte klasik biçim. month ve revenue sütunlarına sahip bir sales tablomuz var. Her satırda önceki ayın gelirini de göstermek istiyoruz.
OVER (ORDER BY month), motorun "önceki" kavramını nasıl tanımlayacağını belirtir. İlk satırın önceki satırı olmadığından, prev_revenue burada NULL olur.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;Sonucu Okuma
Veriler 2024-01 = 100, 2024-02 = 130, 2024-03 = 120 olduğunda sorgu şu sonucu döndürür:
- Oca: gelir 100, önceki gelir NULL
- Şub: gelir 130, önceki gelir 100
- Mar: gelir 120, önceki gelir 130
Her satır, sıralanmış kümede doğrudan üstündeki satırdan değeri aldı. Kendi kendine birleştirme yok, alt sorgu yok, satır kaybı yok.
LEAD İleriye Bakar
LEAD bunun tam tersidir. Bir satırın sırada ne olduğunu bilmesi gerektiğinde kullanın; örneğin siparişler arasındaki süreyi hesaplamak için sonraki satın alma tarihini bulabilirsiniz.
Sıralanmış kümedeki son satırın sonraki satırı yoktur; bu nedenle LEAD sonucu NULL olur.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;Ofset Argümanı
Her iki işlev de isteğe bağlı ikinci bir argüman alır: kaç satır atlanacağı. LAG(col, 2) iki satır geriye gider, LEAD(col, 3) ise üç satır ileri atlar.
Mülakat yapanlar bunu "iki ay önceki gelir" veya "üç satır aşağıdaki değer" gibi isteklerde kullanır. Varsayılan ofset 1'dir.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;Varsayılan Değer Argümanı
Üçüncü argüman, komşu satır olmadığında NULL döndürmek yerine kullanılacak bir değer sağlar. İmza şöyledir: LAG(col, offset, default).
Bu, sonraki bir hesaplamanın NULL değerini kaldıramadığı durumlarda kullanışlıdır; örneğin farkın yine de hesaplanabilmesi için eksik önceki değeri 0 kabul edebilirsiniz.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;PARTITION BY Pencereyi Sıfırlar
Gerçek verilerde nadiren tek bir genel seri bulunur. Genellikle her müşteri, ürün veya bölge içinde karşılaştırma yaparsınız. PARTITION BY, LAG/LEAD hesaplamasını her bölümün başında yeniden başlatır.
Bu, her bölümün ilk satırının LAG işlevinden NULL alması ve farklı bir müşterinin verilerine sınırın ötesinden değer sızmaması anlamına gelir.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;Çözülmüş Örnek: Siparişler Arasındaki Gün Sayısı
Yaygın bir görev, bir müşterinin art arda verdiği siparişler arasındaki aralığı ölçmektir. Önceki sipariş tarihini LAG ile alın, ardından çıkarma işlemi yapın.
Her müşterinin ilk siparişi, çıkarma yapılacak önceki bir tarih olmadığı için NULL verir. Bu, mülakatçıların pencere işlevleriyle çözmenizi beklediği müşteri bazlı karşılaştırma türünün tam olarak kendisidir.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;Neden Kendi Kendine Birleştirme Değil
Pencere işlevlerinden önceki çözüm, ilişkili bir kendi kendine birleştirmeydi: tabloyu, "tarihi bunun altındaki en büyük değere sahip satırla" birleştirmek. Bu yöntem çalışır; ancak uzundur, eşit değerlerde hataya açıktır ve çoğu zaman daha yavaştır.
LAG/LEADamacı tek satırda ifade eder.- Tek bir sıralı geçişte değerlendirilirler.
- Eşit değerler,
ORDER BYile belirlediğiniz kurala göre kesin biçimde çözülür.
"Kendi kendine birleştirme yerine LAG kullanırım" demeniz konuya hâkim olduğunuzu gösterir.
ORDER BY Eksikliğinin Yaygın Sakıncası
OVER yan tümcesinde ORDER BY olmadan "önceki satır" tanımsızdır. Bazı veritabanı motorları bunu reddeder, bazılarıysa öngörülemeyen sonuçlar döndürür. Pencereyi her zaman sıralayın.
Ayrıca OVER içindeki sıralamanın sorgunun dışındaki ORDER BY ifadesinden bağımsız olduğunu unutmayın. Pencere, hangi satırın komşu olduğunu belirler; dış yan tümce ise yalnızca görüntüleme sırasını belirler.
Hızlı Kontrol
Ofset pencere işlevleri hakkındaki anlayışınızı sınayın.
Özet
Artık ofset pencere işlevlerini biliyorsunuz:
LAG(col)pencereninORDER BYsıralamasıyla belirlenen önceki satırı,LEAD(col)ise sonraki satırı okur.- İsteğe bağlı bağımsız değişkenler:
LAG(col, offset, default). PARTITION BYgezinmeyi her grup için sıfırlar; bu nedenle sınır satırlarıNULLolur.- Birbirine komşu satırları karşılaştırmak için kullanılan hantal kendi kendine birleştirmelerin yerini alırlar.
Sırada bunu, analistlerin kesinlikle karşılaşacağı soruya uygulayacağız: dönemden döneme değişim.
Sıkça Sorulan Sorular
“Bitişik Satırlar için LAG ve LEAD” dersi ücretsiz mi?
Evet — “Bitişik Satırlar için LAG ve LEAD” 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 SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.
“Bitişik Satırlar için LAG ve LEAD” dersinde ne öğreneceğim?
SELF JOIN kullanmadan önceki ve sonraki satır değerlerine erişin. SQL 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.
SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL 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.
“Bitişik Satırlar için LAG ve LEAD” 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 SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL 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ı