Kayan Pencerelerde Hareketli Ortalamalar
BETWEEN PRECEDING AND CURRENT ROW ile N dönemlik hareketli ortalamalar hesaplayın.
Kayan Pencerelerde Hareketli Ortalamalar, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 3. 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.
Hareketli Ortalama Sorusu
Analistlere bu soru sürekli sorulur: "Gelirin 7 günlük hareketli ortalamasını hesaplayın." Hareketli (veya kayan) ortalama, her noktayı yakınındaki günlerle birlikte ortalayarak gürültülü günlük veriyi yumuşatır.
Mülakat düzeyinde yanıt, açıkça belirtilmiş kayan çerçeveye sahip bir pencere AVG'sidir. Temel beceri, pencerenin sıralama boyunca doğru biçimde kayması için çerçeve sınırlarını seçmektir.
Temel Kalıp
Hareketli ortalama, AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW) biçimindedir. Çerçeve kayar: her satırda geçerli satırı ve önceki n satırı kapsar.
Günlük satırlar üzerindeki 7 günlük pencere için 6 satır geri gidip geçerli satırı da eklersiniz; böylece toplam 7 satır elde edilir. Buradaki bir eksik ya da fazla sayım, mülakatçıların yakaladığı en yaygın hatadır.
SELECT
sale_date,
amount,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7d
FROM daily_sales;Pencere Boyutunu Doğru Saymak
Pencere boyutu preceding + 1'e eşittir ( +1, geçerli satırdır). Dolayısıyla:
- 3 satırlık pencere:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW - 7 satırlık pencere:
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW - 30 satırlık pencere:
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
Bu aritmetiği mülakatta yüksek sesle söyleyin; böylece kurul, tahminde bulunmadığınızı ve bilinçli hareket ettiğinizi görür.
Merkezlenmiş ve Geriye Dönük Pencereler
Yukarıdaki örnek geriye dönük bir ortalamadır: yalnızca geçmişe bakar; bu nedenle nedenseldir ve tahmin panoları için güvenlidir.
Merkezlenmiş bir ortalama her iki yöne bakar; örneğin 7 satırlık merkezlenmiş bir pencere için ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING kullanılır. Merkezlenmiş pencereler daha simetrik bir yumuşatma sağlar; ancak gerçek zamanlı olarak en yeni satırlar için hesaplanamaz. Kullanım senaryosunun hangisine ihtiyaç duyduğunu belirtin.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centered_avg_7
FROM daily_sales;Pencere Sınırındaki Etki
Verilerin en başında tam pencere henüz mevcut değildir. 7 günlük geriye dönük ortalamanın 1. satırında yalnızca 1 satır kullanılabildiği için AVG yalnızca bu tek değerin ortalamasını alır.
Bu nedenle ilk satırlar, daha az satır üzerinden hesaplanan bir "alışma dönemi" ortalaması gösterir. Mülakatçılar bunun nasıl ele alınacağını sorar. İki seçenek vardır: kısmi pencereyi kabul etmek veya tam bir sayı gerektirerek ilk satırları gizlemek.
Kısmi Pencereleri Gizleme
İş gereksinimi, tam pencere kullanılabilir olana kadar NULL istiyorsa, aynı çerçeve üzerinde COUNT(*) kullanın ve kısa pencereleri bir CASE ifadesiyle boş bırakın.
Bu, sınırlardaki doğruluğu düşündüğünüzü gösteren ve birçok adayın atladığı ayrıntılı, özenli bir dokunuştur.
SELECT
sale_date,
CASE WHEN COUNT(*) OVER w = 7
THEN AVG(amount) OVER w
END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);WINDOW ile Bir Çerçeveyi Yeniden Kullanma
Önceki sorguda adlandırılmış bir WINDOW yan tümcesi kullanılmıştı. Aynı çerçeve birden çok kez geçtiğinde, onu WINDOW w AS (...) ile bir kez tanımlayıp OVER w ile kullanmak sorguyu DRY ve okunabilir tutar.
PostgreSQL, MySQL 8 ve SQL Server adlandırılmış pencereleri destekler. Mülakatta bir tane kullanmak, kopyala-yapıştır pencere işlevlerinin ötesinde bir yetkinliğe işaret eder.
SELECT
sale_date,
AVG(amount) OVER w AS avg_7d,
SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);Takvim Günleri ile Satırlar Arasındaki Tuzak
İnce bir tuzak vardır: tabloda eksik günler bulunuyorsa ROWS 6 PRECEDING, son 7 kaydedilmiş satıra yayılır; bu satırlar 7 takvim gününden daha uzun bir dönemi kapsayabilir.
Aralıkları dikkate alan gerçek bir takvim tabanlı 7 günlük ortalama için uzaklık içeren RANGE kullanın veya önce eksiksiz bir tarih dizisine birleştirme yaparak her günün bir satırı olmasını sağlayın. Bu ayrımdan söz etmek, önceki dersteki ROWS ve RANGE içgörüsünün tam olarak kendisidir.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
) AS calendar_avg_7d
FROM daily_sales;Grup Başına Hareketli Ortalamalar
Çalışan toplamlar gibi, hareketli ortalamaların da genellikle varlık başına sıfırlanması gerekir. Her ürün veya mağaza için gruplar arasında taşmayan kendi kayan penceresini oluşturmak üzere PARTITION BY ekleyin.
Çerçeve ve sıralama her bölümün içinde bağımsız olarak çalışır; böylece her grubun ilk satırları kendi alışma dönemini doğru biçimde başlatır.
SELECT
product_id,
sale_date,
AVG(amount) OVER (
PARTITION BY product_id
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS product_ma_7d
FROM daily_sales;Yumuşatma İş Başında
Neden bunu yapalım? Günlük gelir sivri dalgalanmalar gösterir; hareketli ortalama eğilimi ortaya çıkarır. Yaygın bir analist yanıtı, gösterge panelinin hem sinyali hem de gürültüyü göstermesi için ham değeri yumuşatılmış çizgiyle birlikte sunar.
İvmeyi tespit etmek için kısa ve uzun bir hareketli ortalamayı da (örneğin 7 günlük ve 30 günlük) karşılaştırabilirsiniz; bu, hareketli ortalamaların kesişiminin SQL'deki karşılığıdır.
SELECT
sale_date,
amount,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;Mülakat Kontrol Listesi
Hareketli ortalama sorusunu iyi yanıtlamak için şu noktaları ele alın:
AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).- Pencere boyutu = önceki satır sayısı + 1.
- Geriye dönük ve merkezlenmiş pencere seçimi.
- Kısmi pencere alışma dönemi ve bunu gizleme yöntemi.
- Günler eksik olduğunda
ROWSileRANGEarasındaki fark. - Varlık başına sıfırlamak için
PARTITION BY.
Hızlı Kontrol
Günlük satırlar üzerinde 7 günlük geriye dönük hareketli ortalama için çerçeveyi seçin.
Özet: Hareketli Ortalamalar
Hareketli ortalama, pencere boyutunun önceki satırların sayısına bir eklenmesiyle bulunduğu AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW) biçimindedir. Kullanım senaryosuna uygun olarak geriye dönük veya merkezlenmiş pencereyi seçin, alışma dönemi satırlarını bir COUNT denetimiyle ele alın ve takvim aralıkları önemli olduğunda bir RANGE uzaklığına geçin.
PARTITION BY ile varlık başına sıfırlayın ve adlandırılmış bir WINDOW ile çerçeveleri yeniden kullanın. Sırada, çalışan toplamları toplam içindeki payı gösteren yüzdelere dönüştürüyoruz.
Sıkça Sorulan Sorular
“Kayan Pencerelerde Hareketli Ortalamalar” dersi ücretsiz mi?
Evet — “Kayan Pencerelerde Hareketli Ortalamalar” 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.
“Kayan Pencerelerde Hareketli Ortalamalar” dersinde ne öğreneceğim?
BETWEEN PRECEDING AND CURRENT ROW ile N dönemlik hareketli ortalamalar hesaplayın. 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 3. dersidir.
“Kayan Pencerelerde Hareketli Ortalamalar” 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
- Pencere Çerçeveleriyle Birikimli Toplamlar
- ROWS ve RANGE Çerçevelemesi
- Kayan Pencerelerde Hareketli Ortalamalar
- Birikimli Dağılım ve Toplamın Yüzdesi