İlk satırın toplamı neden iki kaydı içeriyor?
AI ajanının yazdığı SQL raporunda ilk kayıt on birim taşıyor, fakat birikimli toplam sütunu otuzdan başlıyor. İkinci kayıt da aynı saatte ve yirmi birim. Sorgu bu iki eş zamanlı kaydı aynı pencerenin parçası saymış olabilir. Bu durumda toplam hesabının kendisi yanlış değildir; hangi satırların o hesabın kapsamına girdiği beklediğinizden farklıdır. Sıralama ile pencere çerçevesini ayrı ayrı incelemek gerekir.
Bu örnekte birikimli toplamı iki farklı amaç için hazırlıyoruz. İlk amaç, her saat değerine kadar oluşan toplamı o saatin bütün satırlarında göstermek. İkinci amaç, kimlikle bağlanmış belirli bir satır sırası boyunca adım adım ilerlemek. İki amaç farklı sonuç verebilir. Birini doğru, diğerini bütün durumlarda yanlış ilan etmek yerine rapor okuyucusunun hangi soruyu sorduğunu açıkça yazın.
Eş zamanlı kayıtları silmeden tutun
| id | h: zaman anahtarı | qty |
|---|---|---|
| K1 | 1 | 10 |
| K2 | 1 | 20 |
| K3 | 2 | 5 |
K1 ve K2 iki ayrı geçerli kayıttır. Aynı h değerini taşımaları yinelenen iş olduklarını söylemez. Kaynak toplamı 35’tir. Gösterim sırası h, ardından id artan olarak seçilsin. id bu küçük örnekte benzersizdir ve eş saatli kayıtları deterministik sıraya koyar. Bu kimlik sırası gerçek olayların daha hassas zaman sırasını kanıtlamaz; yalnız raporda seçtiğimiz açık bağlama kuralıdır.
PostgreSQL belgeleri, pencere sırasının eş gördüğü kayıtları peer olarak tanımlar. Varsayılan çerçeve, bölümün başından geçerli satırın son sıra eşine kadar uzanır. Bir toplam işlevi bu çerçevenin bütün satırlarını kullanır. Açık ROWS çerçevesi ve uygun sıralama ile satır adımı davranışı kurulabilir. Aşağıdaki salt okunur sorgular bu ayrımı aynı üç kayıt üzerinde gösterir.Kaynak: PostgreSQL — Window Functions
İki kapsamı yan yana hesaplayın
WITH events(id,h,qty) AS (
VALUES ('K1',1,10),('K2',1,20),('K3',2,5)
)
SELECT id,h,qty,
SUM(qty) OVER (ORDER BY h RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS by_time,
SUM(qty) OVER (ORDER BY h,id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS by_row
FROM events
ORDER BY h,id;| id | qty | by_time | by_row |
|---|---|---|---|
| K1 | 10 | 30 | 10 |
| K2 | 20 | 30 | 30 |
| K3 | 5 | 35 | 35 |
K1 satırında h=1 için sıra eşleri K1 ve K2’dir. Saat çerçevesi ikisini de içerir; 10+20=30 olur. Satır çerçevesi ise h,id sırası altında o ana kadar yalnız K1’i görür ve 10 yazar. K2’ye gelindiğinde satır toplamı da 30’a ulaşır. K3 her iki yöntemde önceki bütün katkıları ve kendi beşini içerir. Son toplamın eşit olması ara davranışların aynı olduğu anlamına gelmez.
Sorgunun en sonundaki ORDER BY yalnız sonuç satırlarının sunumunu düzenler. Pencerenin içindeki ORDER BY ve çerçeve ise toplamın hangi kayıtları kullanacağını belirler. Dış sıralamaya id ekleyip pencerenin içinde yalnız h bırakmak, saat eşlerini satır adımlarına çevirmeye yetmez. İki sıralama yazıldığı için gereksiz tekrar gibi görünebilir; fakat sorguda iki ayrı görevi yerine getirirler.
Yalnız ROWS yazmak da tek başına yeterli olmayabilir
Pencereyi ROWS yapıp ORDER BY h ile bırakırsanız aynı saatteki iki kaydın kendi aralarındaki sırası açık değildir. K1 önce işlenirse ara toplamı 10, K2 önce işlenirse onun ara toplamı 20 olabilir. Son toplam yine 35 kalır. Bu nedenle satır bazlı raporda bağlayıcı anahtarı da belirtin. Fiziksel tablo yerleşimini veya kayıt ekleme sırasını sorgunun garanti ettiği sıra gibi sunmayın.
Satır yolu K1→K2→K3: ara toplamlar 10→30→35. Satır yolu K2→K1→K3: ara toplamlar 20→30→35. ORDER BY h,id ilk yolu seçer. Yalnız h, K1/K2 arasını tek başına belirlemez.
Bazı raporlar her zaman diliminde tek satır ister. O durumda önce saat başına toplulaştırma yapmak ayrı bir seçenek olabilir: h1 toplamı 30, h2 katkısı 5. Fakat bu işlem K1 ve K2’nin ayrı satırlarını sonuçtan kaldırır. Buradaki görev kayıtları korumaktır; dolayısıyla gruplama ile pencere hesabını aynı teslim saymayın. Raporun kimlik ayrıntısı gereksinimi hangi yöntemin uygun olduğunu belirler.
AI’dan çerçeveyi adıyla açıklamasını isteyin
events: K1/h1/10, K2/h1/20, K3/h2/5. Her kayıt ayrı ve qty sayısal. Bir sütunda saat eşlerini birlikte alan RANGE çerçevesi, diğerinde ORDER BY h,id ile açık ROWS çerçevesi kullan. Kaynak satırlarını koru. K1’in iki toplamını ve son 35 kontrolünü açıkla. Dış ORDER BY ile pencere ORDER BY rollerini ayır. Aynı saatte fiziksel ekleme sırasını garanti sayma; gerçek operasyon verisi kullanma.
Sorguyu gerçek rapora taşırken bölümleme anahtarını da kontrol edin. Birden fazla ekip, cihaz veya müşteri listesi aynı sonuçta bulunabilir. Her grubun toplamı ayrı ilerleyecekse PARTITION BY kapsamı ayrıca gerekir. Bu makalenin küçük verisi tek bölümden oluşur; bir grubun başlangıcında sıfırlama davranışı göstermez. Yeni bir bölüm eklediğinizde önce beklenen ara toplamları elde hazırlayıp sonra sorguyla karşılaştırın.
- Birikim saat düzeyinde mi, satır düzeyinde mi?
- Eş kayıtların bağlanacağı anahtar açık mı?
- Çerçeve başlangıcı ve bitişi yazılı mı?
- Ara toplamlar kadar son kaynak toplamı da denetlenmiş mi?
Aynı saate bir kayıt daha ekleyin
K4/h1/7 kaydını ekleyin. h,id artan sıra K1,K2,K4,K3 olur. Saat toplamı ve satır toplamı sütunlarını yeniden hesaplayın. K3’ün id bakımından K4’ten önce görünmesine rağmen neden sonuçta daha sonra geldiğini açıklayın. Kimlik bağlayıcıdır, ama birincil sıralama anahtarı hâlâ h değeridir.
Saat çerçevesi: K1=37, K2=37, K4=37, K3=42. Satır çerçevesi: K1=10, K2=30, K4=37, K3=42. Kaynak toplamı 10+20+7+5=42. K3 h2’de, diğerleri h1’dedir; önce h sıralanır.
Birikimli toplam raporunda formülün yanında sıralama ve çerçeve sözleşmesini saklayın. Böylece ilk satırın neden otuz veya on gösterdiğini yeniden açıklayabilirsiniz. AI’ın yazdığı SQL’i yalnız son toplamla onaylamak yerine ara satırların hangi kayıtları kapsadığını görmek, raporun gerçek iş sorusuyla uyuşmasını sağlar.
Kaynaklar ve doğrulama
- PostgreSQL — Window Functions
Varsayılan pencere çerçevesinin geçerli satırın sıra eşlerini kapsaması ve açık çerçeve seçimi.
Erişim ve kontrol:
Yöneticiler İçin Yapay Zekâ
Yöneticiler İçin Yapay Zekâ programı için bir rapor kabul sorusu belirleyin: aynı zamanda gelen işler raporda hangi toplamı görmeli? Bu örnek, teknik sorguyla iş beklentisini birlikte tartışmak için kullanılabilir.
- Kuruma özel planlanır