Satır Numarası Farkı Hilesi
Ardışık değerleri adalar halinde gruplamak için bir diziden ROW_NUMBER çıkarın.
Satır Numarası Farkı Hilesi, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 2. 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.
En Zarif Ada Anahtarı
Satır numarası farkı tekniği, mülakatçıların ardışık tamsayı veya tarihlerden oluşan adalar için en çok görmek istediği tekniktir. Anahtarı tek bir çıkarma işlemiyle üretir; LAG ve çalışan toplam gerektirmez.
Temel fikir şudur: değerden bir ROW_NUMBER çıkarın. Ardışık değerlerden oluşan her dizide hem değer hem de satır numarası her adımda tam 1 arttığından, farkları dizinin tamamında sabit kalır. Bu sabit, ada anahtarınızdır.
Fark Neden Sabit Kalır
Ardışık bir dizideki iki bitişik satırı düşünün. Bir satırdan sonraki satıra geçerken değer 1, satır numarası da 1 artar. Bunları çıkarın; +1'ler birbirini götürür, dolayısıyla value - row_number değişmez.
Ancak bir boşluk oluştuğu anda değer 1'den fazla sıçrarken satır numarası yalnızca 1 artmaya devam eder. Fark yeni bir sabite kayar. Bir adayı diğerinden ayıran tam olarak bu kaymadır.
Verilerimizde Görmek
1, 2, 3, 7, 8, 10 giriş günlerini hatırlayın. Satır numarasını ve farkı yan yana yazalım:
- gün 1, satır no 1, fark 0
- gün 2, satır no 2, fark 0
- gün 3, satır no 3, fark 0
- gün 7, satır no 4, fark 3
- gün 8, satır no 5, fark 3
- gün 10, satır no 6, fark 4
Farklar (0,0,0,3,3,4), satırları üç adaya kusursuz biçimde ayırır. Aynı fark, aynı ada demektir.
SELECT
day_no,
ROW_NUMBER() OVER (ORDER BY day_no) AS rn,
day_no - ROW_NUMBER() OVER (ORDER BY day_no) AS grp
FROM logins
ORDER BY day_no;Adaları Özetleme
Fark grup anahtarı olarak kullanıldığında son sorgu standart özetlemedir. Farkı bir CTE içine alıp GROUP BY uygulayın:
Bu, öncekiyle aynı üç adayı döndürür; ancak SQL, LAG ve çalışan toplam sürümünden daha kısa ve anlaşılırdır. Tamsayı veya eşit adımlı diziler için ilk başvurulacak çözüm budur.
WITH keyed AS (
SELECT
day_no,
day_no - ROW_NUMBER() OVER (ORDER BY day_no) AS grp
FROM logins
)
SELECT
MIN(day_no) AS start_day,
MAX(day_no) AS end_day,
COUNT(*) AS length
FROM keyed
GROUP BY grp
ORDER BY start_day;İnce Nokta: Değerler Birer Birer İlerlemeli
Basit fark yöntemi, dizinin her adımda tam olarak 1 arttığını varsayar. Bu, boşluksuz tamsayılar ve ardışık takvim günleri için doğrudur; ancak değerler başka bir sabit miktarda ilerliyorsa veya yinelenen değerler varsa yöntem bozulur.
- 2,4,6,8 gibi çift değerler, değerden satır numarasını çıkarma işlemine boşluk varmış gibi görünecektir.
- Yinelenen değerler hizalamayı bozar; çünkü değer artmazken satır numarası artmaya devam eder.
Bu sınırlamayı ve nasıl düzeltileceğini bilmek, ezberlenmiş bir yöntemle gerçek anlayış arasındaki farkı ortaya koyar.
Sabit Adımlı Dizileri Düzeltme
Değerler 1 yerine bilinen sabit k kadar ilerliyorsa önce normalleştirin: değeri k'ye bölün (veya tamsayılar için value / k kullanın); böylece her adım yeniden 1 olur, ardından satır numarasını çıkarın.
Örneğin, 2'şer ilerleyen çift sayılar için day_no / 2 - ROW_NUMBER() kullanın. Normalleştirilmiş değer artık her ardışık öğede 1 artar ve sabit fark özelliğini yeniden sağlar.
SELECT
val,
(val / 2) - ROW_NUMBER() OVER (ORDER BY val) AS grp
FROM even_series
ORDER BY val;Bunu Tarihlere Uygulama
Tarihler, bunun gerçek hayattaki en yaygın biçimidir. Takvim tarihleri bir satır numarasından doğrudan çıkarılamaz; bu nedenle önce tarihi gün sayısına dönüştürün. Postgres'te sabit bir başlangıç tarihi çıkararak tamsayı cinsinden gün sayısı elde edin, ardından aynı yöntemi uygulayın.
Ardışık takvim günleri arasındaki fark 1 olduğundan, gün sayısı ile satır numarası arasındaki fark bir ada içinde yine sabit kalır.
WITH keyed AS (
SELECT
login_date,
(login_date - DATE '2000-01-01')
- ROW_NUMBER() OVER (ORDER BY login_date) AS grp
FROM daily_logins
)
SELECT MIN(login_date) AS start_date,
MAX(login_date) AS end_date,
COUNT(*) AS days_in_run
FROM keyed GROUP BY grp ORDER BY start_date;Diyalektler Arası Tarih Farkı Hesaplama
Tarihi tamsayıya dönüştürme adımı veritabanı motoruna göre değişir ve görüşmeciler farklı SQL diyalektlerini bilmenizi takdir eder:
- Postgres: bir tarih sabitini çıkarın:
login_date - DATE '2000-01-01'bir tamsayı döndürür. - MySQL:
DATEDIFF(login_date, '2000-01-01')kullanın. - SQL Server:
DATEDIFF(day, '2000-01-01', login_date)kullanın.
Bazı motorlarda daha pratik bir yol da şudur: aralık aritmetiğini kullanarak ROW_NUMBER gününü doğrudan tarihten çıkarın, ardından elde edilen başlangıç tarihine göre GROUP BY uygulayın.
SELECT
login_date,
login_date - (ROW_NUMBER() OVER (ORDER BY login_date)
* INTERVAL '1 day') AS grp_date
FROM daily_logins;Gruplara Göre PARTITION Ekleme
Kullanıcı başına adalar için satır numarasını grup sütununa göre bölümlendirin. Kritik nokta şudur: iki farklı kullanıcı tesadüfen aynı fark değerini üretebileceğinden, gruplama anahtarına bölümlendirme sütununu da eklemeniz gerekir.
Bu nedenle hem user_id hem de hesaplanan fark ile GROUP BY uygulayın. Son GROUP BY ifadesinde user_id değerini unutmak, görüşmecilerin yakalamayı sevdiği ince bir hatadır.
WITH keyed AS (
SELECT user_id, day_no,
day_no - ROW_NUMBER()
OVER (PARTITION BY user_id ORDER BY day_no) AS grp
FROM logins
)
SELECT user_id, MIN(day_no) AS start_day,
MAX(day_no) AS end_day, COUNT(*) AS len
FROM keyed
GROUP BY user_id, grp
ORDER BY user_id, start_day;Yöntem mi LAG mi: Hangisini Kullanmalı
Artık araç setinizde iki sağlam teknik var. Seçiminizi bilinçli yapın:
- Satır numarası farkı: eşit adımlı değer dizileri (boşluksuz tamsayılar, ardışık tarihler) için en kısa ve en temiz yöntemdir. Komşuluk, değerlerin sabit bir miktar kadar farklı olması anlamına geliyorsa ilk tercihiniz bu olmalıdır.
- LAG ve birikimli toplam: komşuluk sabit bir sayısal adıma bağlı olmadığında daha esnektir; örneğin “önceki satırla aynı durum” veya düzensiz özel kurallar için.
Mülakatta seçiminizi ve nedenini açıklayın; gerekçeniz sözdiziminden daha çok etkiler.
Yinelenen Değerleri Güvenli Biçimde Ele Alma
Bir değer tekrarlanabiliyor ve yine de her ardışık dizi için bir ada istiyorsanız, satır numarasının değerlerle bire bir hizalanması için önce DISTINCT veya bir gruplama adımıyla tekilleştirin. Alternatif olarak, eşit değerlerin aynı sırayı paylaşması için ROW_NUMBER yerine DENSE_RANK kullanın.
Her zaman görüşmeciye yinelenen değerlerin oluşup oluşamayacağını sorun; doğru önlem, yinelenen değerlerin bir dizi içinde diziyi uzatması mı yoksa yok sayılması mı gerektiğine bağlıdır.
WITH d AS (SELECT DISTINCT day_no FROM logins)
SELECT day_no,
day_no - ROW_NUMBER() OVER (ORDER BY day_no) AS grp
FROM d;Hızlı Kontrol
Yöntemin neden işe yaradığını anladığınızdan emin olun.
Özet: Fark Yöntemi
Artık en temiz ada anahtarına sahipsiniz:
- Anahtar formülü:
value - ROW_NUMBER() OVER (ORDER BY value)her ardışık dizi için sabittir. - Başlangıç, bitiş ve uzunluğu elde etmek için farkı GROUP BY ile gruplayın.
- Sabit adımlı dizilerde önce normalleştirme yapın (adım miktarına bölün).
- Tarihlerde, diyalektin fark işlevini kullanarak değeri tamsayı cinsinden gün sayısına dönüştürün.
- Grup bazında çalışırken satır numarasını
PARTITION BYile bölümlendirin ve sonGROUP BYifadesine grup sütununu ekleyin. - Yinelenen değerlere karşı
DISTINCTveyaDENSE_RANKkullanın.
Sırada odağı adalardan boş alanlara çevirip boşlukları bulacağız.
Sıkça Sorulan Sorular
“Satır Numarası Farkı Hilesi” dersi ücretsiz mi?
Evet — “Satır Numarası Farkı Hilesi” 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.
“Satır Numarası Farkı Hilesi” dersinde ne öğreneceğim?
Ardışık değerleri adalar halinde gruplamak için bir diziden ROW_NUMBER çıkarın. 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 2. dersidir.
“Satır Numarası Farkı Hilesi” 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
- Boşluklar ve Adalar Problemini Tanıma
- Satır Numarası Farkı Hilesi
- Bir Dizideki Boşlukları Bulma
- Tarih ve Durum Değişiklikleriyle Adalar