Anahtar Başına En Güncel Satırı Koruma
Anahtara göre bölümleme ve tarihe göre sıralamayla 'müşteri başına en güncel kayıt' örüntüsünü öğrenin.
Anahtar Başına En Güncel Satırı Koruma, 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.
Anahtar Başına En Son Kayıt Sorusu
"Her müşteri için en son siparişi döndürün." "Her cihazın en güncel durumunu alın." Bu anahtar başına en son satır problemi, gerçek analiz çalışmalarında sürekli ortaya çıktığı için SQL mülakatlarında en sık karşılaşılan görevlerden biridir.
Bu, grup başına en üstteki tek kaydın özel bir biçimidir: anahtara göre bölümleyin, zaman damgasına göre azalan sırada düzenleyin ve ilk satırı tutun. Bu derste kalıbı ve alternatiflerini ayrıntılı olarak ele alacağız.
MAX Tek Başına Neden Yetersiz Kalır
İlk akla gelen yanıt, müşteri bazında gruplanmış MAX(order_date) kullanmaktır. Bu, en son tarihi verir; ancak o siparişin satırının geri kalanını, sipariş kimliğini, tutarını veya durumunu vermez.
Mülakatçı tam en son satırı istiyorsa MAX ile GROUP BY kullanımı, anahtar ve en yüksek tarih üzerinden tabloya geri ek birleştirme yapılmasını gerektirir; bu yöntem uzundur ve eşitliklerde sorun çıkarabilir. Pencere işlevleri daha temizdir.
-- Gives the date, not the full row
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;ROW_NUMBER Kalıbı
Anahtara göre bölümleyin, zaman damgasına göre azalan sırada düzenleyin; en son satır rn = 1 değerini alır. Yalnızca bu satırları tutarak anahtar başına en son kaydın tamamını elde edersiniz.
Başvurulacak yanıt budur. Zaman damgaları eşit olsa bile anahtar başına tam olarak bir satır döndürür; "en son satır" ifadesi genellikle bunu anlatır.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC
) AS rn
FROM orders
)
SELECT customer_id, order_id, order_date, amount
FROM ranked
WHERE rn = 1;Zaman Damgası Eşitliklerini Bozma
Aynı müşterinin iki siparişi aynı order_date değerini paylaşabilir (aynı gün veya tamamen aynı zaman damgaları). Bir eşitlik bozucu olmadan rn = 1 değerini hangi satırın alacağı keyfidir ve çalıştırmalar arasında değişebilir.
En son satırın belirli olması için order_id DESC gibi benzersiz bir ikincil anahtar ekleyin. Mülakatçılar özellikle bu uç durumu fark edip etmediğinizi sınar.
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, order_id DESC
) AS rnEn Son Kayıt mı, Tüm Eşit Kayıtlar mı
Zaman damgaları eşit olduğunda "en son" ifadesinin ne anlama geldiğine karar verin:
- Anahtar başına tam olarak bir satır istiyorsanız → eşitlik bozucuyla birlikte
ROW_NUMBERkullanın. - En yüksek zaman damgasını paylaşan tüm satırları istiyorsanız → bunun yerine
RANK() = 1kullanın; bu, en son tarihe sahip tüm eşit satırları döndürür.
Bu açıklayıcı soruyu sormanız, yalnızca söz dizimini değil anlamı da anladığınızı gösterir.
WITH ranked AS (
SELECT *,
RANK() OVER (
PARTITION BY customer_id ORDER BY order_date DESC
) AS rnk
FROM orders
)
SELECT * FROM ranked WHERE rnk = 1;İlişkili Alt Sorgu Alternatifi
Pencere işlevleri yaygınlaşmadan önce anahtar başına en son kayıt yanıtında ilişkili bir alt sorgu kullanılırdı: bir satır yalnızca aynı anahtar için daha ileri tarihli başka bir satır yoksa tutulurdu.
Bu yöntem çalışır, ancak iç sorguyu her satır için çalıştırdığı için büyük tablolarda daha yavaştır ve eşitliklerde kullanımı zordur. Kapsamınızı göstermek için bundan söz edebilirsiniz; ancak performans için pencere işlevi yanıtını tercih edin.
SELECT o.*
FROM orders o
WHERE o.order_date = (
SELECT MAX(o2.order_date)
FROM orders o2
WHERE o2.customer_id = o.customer_id
);PostgreSQL DISTINCT ON Kısayolu
PostgreSQL kısa ve öz bir kalıp sunar: DISTINCT ON (key), ORDER BY'a göre her anahtar için ilk satırı tutar. ORDER BY ifadesi önce aynı anahtar sütunlarıyla, ardından eşitlik bozucu veya zaman damgasıyla başlamalıdır.
PostgreSQL'de zarif ve hızlıdır, ancak taşınabilir değildir. Bunu lehçeye özgü bir ek seçenek olarak belirtin; taşınabilir varsayılanınız olarak ROW_NUMBER kullanmaya devam edin.
SELECT DISTINCT ON (customer_id)
customer_id, order_id, order_date, amount
FROM orders
ORDER BY customer_id, order_date DESC, order_id DESC;Koşullu En Son Satır
Gerçek sorular filtreler de ekler: "her müşteri için en son tamamlanmış sipariş" gibi. Yalnızca koşulu sağlayan satırların numaralandırılması için filtreyi sıralamadan önce uygulayın.
Koşulu iç sorgunun WHERE bölümüne yazın (bu bölüm pencere işlevinden önce çalışır), ardından dış sorguda rn = 1 değerini alın. Sıralamadan sonra filtre uygulamak yanlış satırı döndürür.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date DESC, order_id DESC
) AS rn
FROM orders
WHERE status = 'completed'
)
SELECT * FROM ranked WHERE rn = 1;Çalışılmış Örnek: En Son Cihaz Durumu
Bir status_log tablosu device_id, status ve logged_at değerlerini kaydeder. Her cihazın geçerli durumunu almak için device_id'ye göre bölümleyin, logged_at DESC'e göre sıralayın ve rn = 1 satırını tutun.
Bu, yalnızca eklenen olay günlüğünden birçok varlığın "geçerli durumunu" gösteren panoların temel mekanizmasıdır. Aynı yöntem en son fiyat, en son konum ve en son sürüm sorgularını da destekler.
WITH latest AS (
SELECT device_id, status, logged_at,
ROW_NUMBER() OVER (
PARTITION BY device_id ORDER BY logged_at DESC
) AS rn
FROM status_log
)
SELECT device_id, status, logged_at
FROM latest
WHERE rn = 1;Performans Notları
Kıdemli düzeyde değerlendirilmenizi sağlayacak noktalar:
(customer_id, order_date DESC)üzerinde bir dizin bulunması, motorun her anahtar için en son satırı verimli biçimde okumasını sağlar.- Pencere yaklaşımı tabloyu bir kez tarar; ilişkili alt sorgu bunu yapmaz.
- PostgreSQL'deki
DISTINCT ONaynı dizini kullanabilir ve çoğu zaman tek tabloluk en hızlı seçenektir. - Yalnızca eklenen olay günlükleri için artımlı olarak yenilenen somutlaştırılmış bir "en son" tablosu kullanmayı düşünün.
Yaygın Hatalar
Şunlara dikkat edin:
MAX(date)kullanıp tam satır yerine yalnızca tarihi döndürmek.- Eşit tarihlerde belirli olmayan sonuçlar üretmemek için eşitlik bozucu eklemeyi unutmak.
- Koşulu sıralama sonrasında uygulamak; bu, dışlanması gereken bir satırın seçilmesine neden olabilir.
- "En son tek satır"ı (
ROW_NUMBER) "en son eşit satırların tümü" (RANK) ile karıştırmak.
Hızlı Kontrol
Anahtar başına en son satırı getiren doğru sorguyu seçin.
Özet: Anahtar Başına En Son Satır
Kalıp: PARTITION BY anahtar, ORDER BY zaman damgası DESC (artı benzersiz bir eşitlik bozucu), rn = 1'i tutun.
MAX(date)tam satırı değil, tarihi verir.- Belirli sonuçlar elde etmek için her zaman bir eşitlik bozucu ekleyin.
- En son zaman damgasında eşit olan tüm satırları istiyorsanız
RANK() = 1kullanın. - Filtre koşulları sıralamadan önce iç sorguya aittir.
- PostgreSQL
DISTINCT ON, kısa ve hızlı, lehçeye özgü bir alternatiftir.
Sıkça Sorulan Sorular
“Anahtar Başına En Güncel Satırı Koruma” dersi ücretsiz mi?
Evet — “Anahtar Başına En Güncel Satırı Koruma” 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.
“Anahtar Başına En Güncel Satırı Koruma” dersinde ne öğreneceğim?
Anahtara göre bölümleme ve tarihe göre sıralamayla 'müşteri başına en güncel kayıt' örüntüsü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 4. dersidir.
“Anahtar Başına En Güncel Satırı Koruma” 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
- ROW_NUMBER ile Grup Başına İlk N Satır
- İlk N İçindeki Eşitlikleri Ele Alma
- Satırların Güvenli Tekilleştirilmesi
- Anahtar Başına En Güncel Satırı Koruma