Offset
⚠️
Offset
fonksiyonu şu anda MySQL/MariaDB, MongoDB ve Druid için kullanılamaz.
Offset
fonksiyonu, bir ifadenin değerini farklı bir satırda döndürür. Offset
yalnızca sorgu oluşturucunun Özetleme adımında kullanılabilir (özel bir sütun oluşturmak için Offset
kullanamazsınız).
Sözdizimi: Offset(ifade, satırKayması)
ifade
, farklı bir satırdan alınacak değerdir.
satırKayması
, geçerli satıra göre sayıdır. Örneğin, önceki satır için -1
veya sonraki satır için 1
.
Örnek: Offset(Sum([Toplam]), -1)
, önceki satırdaki Sum([Toplam])
değerini alır.
Kırılımların sırası önemlidir
Offset
diğer satırlara başvurduğu için, kırılımların sırası önemlidir ("Gruplandır" bölümündeki gruplar, Özetleme adımında). Patrona önce ilk gruba göre sıralar, ardından ek kırılımlara göre bölümlendirir. Örneğin, ürün kategorisine göre sipariş sayılarını zaman içinde ve önceki dönem için ürün kategorisine göre sayıları görmek istiyorsanız, önce Oluşturulma Tarihi
'ne, ardından ürün kategorisine göre gruplandırmalısınız.
Offset eksik verileri hesaba katmaz
Offset
yalnızca sahip olduğunuz satırlara başvurabilir, bu da doğru ancak beklenmedik sonuçlar üretebileceği anlamına gelir. Örneğin, her günün sayısını önceki günle karşılaştırmak istediğinizi varsayalım.
Aşağıdaki tabloyu ele alalım, burada Önceki
sütunu Offset(Count, -1)
ifadesiyle oluşturulmuştur:
Tarih | Sayı | Önceki |
---|---|---|
1-Eki-22 | 6 | |
2-Eki-22 | 3 | 6 |
4-Eki-22 | 2 | 3 |
4 Ekim için Önceki
sütunundaki değer 3
'tür, bu da önceki satırın değeridir. Verilere göre doğru olsa da, önceki satır 2 Ekim'dir; önceki gün olan 3 Ekim için veri yoktur. Önceki günleri (veya haftaları veya her neyse) karşılaştırmak için offset kullanmak istiyorsanız, verilerinizin karşılaştırmak istediğiniz her veri noktası için bir satır içerdiğinden emin olmanız gerekir. Bu durumda, verilerinizin sayının sıfır olduğu günler de dahil olmak üzere her gün için bir satır içermesi gerekir. Verilerinizde tarihler eksikse, her günün verilerinizde bir satırı olduğundan emin olmak için bir takvim tablosunu verilerinize birleştirebilirsiniz.
Veri tipleri
Offset
fonksiyonu, offset satırında hangi değer varsa onu döndürür.
Veri tipi | Offset tarafından döndürülen |
---|---|
String | ✅ |
Number | ✅ |
Timestamp | ✅ |
Boolean | ✅ |
JSON | ✅ |
Offset
kullanarak yıllık (YoY) zaman serisi karşılaştırması örneği
Örnek veritabanında, sipariş sayısını yıldan yıla (YoY) karşılaştırmak için Offset
kullanabilirsiniz.
İlk olarak, Toplamın Toplamına göre özetleyin. Ardından, bu toplamayı tekrar özetleyin, bu sefer önceki satırın değerini almak için Offset
kullanın.
Offset(Sum([Toplam]), -1)
Ardından sonuçları yıla göre Oluşturulma Tarihi
ne göre gruplandırın:
Bu da şu sonucu verir:
Bu offsetlerle ("Önceki dönem" sütunundaki Toplamlar), yıllık Toplamlar arasındaki fark gibi şeyleri hesaplamak için özel sütunlar oluşturabiliriz:
[Toplamın toplamı] - [Önceki dönem]
Ve yıldan yıla yüzde değişim:
[Fark] / [Önceki dönem] * 100
Offset
kullanarak hareketli ortalama örneği
Offset
ile özel bir ifade kullanarak hareketli ortalamaları hesaplayabilirsiniz.
Örneğin, sipariş toplamlarının son üç ay içindeki hareketli ortalama toplamını hesaplamak istediğinizi varsayalım. Bu hareketli ortalamaları hesaplamak için özel bir ifade oluşturabilirsiniz:
(Toplam([Toplam]) + Offset(Toplam([Toplam]), -1) + Offset(Toplam([Toplam]), -2)) / 3
Yukarıdaki ifade, bu dönemin toplamını, önceki iki dönemin toplamlarıyla (sırasıyla -1
ve -2
offset) toplar ve ardından bu dönemler arasındaki ortalamayı elde etmek için üçe böler.
İlgili fonksiyonlar
SQL
Offset
fonksiyonu, SQL'in LAG
ve LEAD
pencere fonksiyonlarıyla karşılaştırılır.
Örneğin, a) bu ayın sipariş sayılarını b) önceki ayın sipariş sayılarıyla karşılaştırmak için iki serili bir çizgi grafik oluşturmak istiyorsanız, bu ayın siparişlerini count
ile sayar, ardından önceki ayın siparişlerini saymak için bir offset
ifadesi kullanırsınız, şöyle:
Offset(count, -1)
Arka planda, Patrona bu Offset
ifadesini bir LAG
pencere fonksiyonuna çevirir, bu sorguda olduğu gibi:
SELECT
"source"."CREATED_AT" AS "CREATED_AT",
COUNT(*) AS "count",
LAG(COUNT(*), 1) OVER (
ORDER BY
"source"."CREATED_AT" ASC
) AS "Önceki dönem sipariş sayısı"
FROM
(
SELECT
DATE_TRUNC('month', "PUBLIC"."ORDERS"."CREATED_AT") AS "CREATED_AT"
FROM
"PUBLIC"."ORDERS"
) AS "source"
GROUP BY
"source"."CREATED_AT"
ORDER BY
"source"."CREATED_AT" ASC