Ana içeriğe geç
Kesit SQL
Orta · Pencere Fonksiyonları

Kümülatif toplam ve hareketli ortalama (running total, moving average)

ROWS BETWEEN ile pencere çerçevesi tanımlamak.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

ORDER BY eklenince toplam birikir

WITH aylik AS (
  SELECT strftime('%Y-%m', order_date) AS ay, COUNT(*) AS siparis
  FROM orders WHERE order_date LIKE '2024%'
  GROUP BY ay
)
SELECT ay, siparis,
       SUM(siparis) OVER (ORDER BY ay) AS kumulatif
FROM aylik;

Çerçeve (frame) tanımı

Pencerenin hangi satırları kapsayacağını açıkça belirtebilirsin:

İfadeAnlamı
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWBaştan bu satıra (kümülatif)
ROWS BETWEEN 2 PRECEDING AND CURRENT ROWSon 3 satır (hareketli pencere)
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGÖnceki, kendisi, sonraki
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWINGBu satırdan sona
WITH gunluk AS (
  SELECT order_date AS gun, COUNT(*) AS siparis
  FROM orders WHERE order_date >= '2024-11-01'
  GROUP BY gun
)
SELECT gun, siparis,
       ROUND(AVG(siparis) OVER (ORDER BY gun ROWS BETWEEN 6 PRECEDING AND CURRENT ROW), 2) AS ort_7
FROM gunluk;
ROWS ile RANGE farkıORDER BY olup çerçeve belirtilmediğinde varsayılan RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW'dur. RANGE, sıralama değeri eşit olan satırları birlikte ele alır; tekrarlı tarihlerde beklenmedik kümülatif değerler görürsün. Emin olmak için ROWS yaz.

Derinleş: çerçeveyi sesli oku

ROWS BETWEEN 6 PRECEDING AND CURRENT ROW “bu satır ve ondan önceki 6 satır” demektir, 6 gün değil. Siparişsiz günler tabloda yoksa pencere 7 günden fazlasına yayılır; önce bir takvimle boş günleri doldur. İlk 6 satırda pencere eksiktir; bunu raporda belirt ya da o satırları dışarıda bırak.

Alıştırmalara geç (8)