Ana içeriğe geç

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:

TarihSayıÖnceki
1-Eki-226
2-Eki-2236
4-Eki-2223

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 tipiOffset 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 Tarihine göre gruplandırın:

Yıldan yıla karşılaştırma

Bu da şu sonucu verir:

Yıldan yıla sipariş toplamlarının toplamı

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

Fark ve yüzde değişim

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.

Hareketli ortalama

İ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

Daha fazla okuma