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:
| İfade | Anlamı |
|---|---|
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | Baştan bu satıra (kümülatif) |
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW | Son 3 satır (hareketli pencere) |
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING | Önceki, kendisi, sonraki |
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING | Bu 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.