Peek(), bir tablodaki bir alanın zaten yüklenmiş bir satırının değerini döndürür. Satır numarası belirtilebilir (tabloda olduğu gibi). Satır numarası belirtilmezse, daha önce yüklenmiş son kayıt kullanılır.
peek() fonksiyonu çoğu ez daha önce yüklenmiş bir tablonun ilgili sınırlarını; yani belirli bir alanın ilk ve son değerlerini bulmak için kullanılır. Çoğu durumda bu değer daha sonra örneğin bir do-while döngüsünde kullanılmak üzere bir değişkende saklanır.
Söz Dizimi:
Peek(
field_name
[, row_no[, table_name ] ])
Dönüş verileri türü: dual
Bağımsız Değişkenler:
Bağımsız Değişkenler
Bağımsız Değişken
Açıklama
field_name
Döndürülen değerin gerekli olduğu alanın adı.Giriş değeri bir dize (örneğin, tırnak içine alınmış bir değişmez değer) olarak verilmelidir.
row_no
Tabloda alanın zorunlu olduğunu belirten satır. Bir ifade olabilir, ancak tamsayıya çözümlenmelidir. 0 ilk kaydı ve 1 ikinci kaydı gösterir ve bu böyle devam eder. Negatif sayılar tablonun sonundan itibaren sırayı belirtir. -1 değeri, okunan son kaydı gösterir.
row_no belirtilmezse -1 olduğu varsayılır.
table_name
Sonunda iki nokta üst üste olmayan tablo etiketi. table_name belirtilmezse geçerli tablo olduğu varsayılır. LOAD deyimi dışında kullanılırsa veya başka bir tabloya referansta bulunursa, table_name dahil edilmelidir.
Sınırlamalar:
Fonksiyon yalnızca zaten yüklenmiş olan kayıtlardan değerler döndürebilir. Bu; bir tablonun ilk satırında row_no olarak -1 kullanan bir çağrı NULL döndürür.
1. Örnek
Örnek kodu uygulamanıza ekleyin ve çalıştırın. Sonucu görmek için, sonuçlar sütununda listelenen alanları uygulamanızda bir sayfaya ekleyin.
EmployeeDates:
Load * Inline [
EmployeeCode|StartDate|EndDate
101|02/11/2010|23/06/2012
102|01/11/2011|30/11/2013
103|02/01/2012|
104|02/01/2012|31/03/2012
105|01/04/2012|31/01/2013
106|02/11/2013|
] (delimiter is '|');
First_last_Employee:
Load
EmployeeCode,
Peek('EmployeeCode',0,'EmployeeDates') As FirstCode,
Peek('EmployeeCode',-1,'EmployeeDates') As LastCode
Resident EmployeeDates;
Sonuç tablosu
Çalışan kodu
StartDate
EndDate
FirstCode
LastCode
101
02/11/2010
23/06/2012
101
106
102
01/11/2011
30/11/2013
101
106
103
02/01/2012
101
106
104
02/01/2012
31/03/2012
101
106
105
01/04/2012
31/01/2013
101
106
106
02/11/2013
101
106
FirstCode = 101; çünkü Peek('EmployeeCode',0, 'EmployeeDates') öğesi EmployeeDates tablosundaki ilk EmployeeCode değerini döndürür.
LastCode = 106 çünkü Peek('EmployeeCode',-1, 'EmployeeDates'), EmployeeDates tablosundaki son EmployeeCode değerini döndürür.
row_no bağımsız değişkeninin değeri değiştirildiğinde tablodaki diğer satırların değerleri döndürülür. Şöyle ki:
Peek('EmployeeCode',2, 'EmployeeDates'), FirstCode olarak tablodaki 103 olan üçüncü değeri döndürür.
Ancak bu örneklerde tablonun üçüncü bağımsız değişken; table_name olarak belirtilmemesi durumunda fonksiyonun mevcut (bu örnekte dahili) tabloya başvurduğuna dikkat edin.
2. Örnek
Bir tabloda daha alttaki verilere erişmek istiyorsanız, bunu iki adımda yapmanız gerekir: Önce tüm tabloyu geçici bir tabloya yükleyin ve ardından Peek() kullanarak yeniden sıralayın.
Örnek kodu uygulamanıza ekleyin ve çalıştırın. Sonucu görmek için, sonuçlar sütununda listelenen alanları uygulamanızda bir sayfaya ekleyin.
T1:
LOAD * inline [
ID|Value
1|3
1|4
1|6
3|7
3|8
2|1
2|11
5|2
5|78
5|13
] (delimiter is '|');
T2:
LOAD *,
IF(ID=Peek('ID'), Peek('List')&','&Value,Value) AS List
RESIDENT T1
ORDER BY ID ASC;
DROP TABLE T1;
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
Sonuç tablosu
Kimlik
Liste
Değer
1
3,4
4
1
3,4,6
6
1
3
3
2
1,11
11
2
1
1
3
7,8
8
3
7
7
5
2,78
78
5
2,78,13
13
5
2
2
IF() deyimi T1 geçici tablosundan oluşturulur. Peek('ID'), geçerli tablo T2 içinde bir önceki satırda bulunan ID alanına referansta bulunur. Peek('List'), ifade değerlendirildiği sırada oluşturulmakta olan T2 tablosunda bir önceki satırda bulunan List alanına referansta bulunur.
Deyim şöyle değerlendirilir: Mevcut ID değeri, önceki ID değeriyle aynıysa, Peek('List') değerini mevcut Value değeri ile birleştirilmiş olarak yazın. Aksi takdirde sadece mevcut Value değerini yaz.
Peek('List') zaten birleştirilmiş bir sonuç içeriyorsa, yeni Peek('List') sonucu buna birleştirilir.
Bilgi notuOrder by cümlesine dikkat edin. Bu cümle tablonun nasıl sıralandığını belirtir (ID alanına göre artan sırada). Bu olmadan, Peek() fonksiyonu dahili tablonun rastgele düzenlemesini kullanır ve bu da öngörülemez sonuçlara yol açabilir.
Örnek 3
Örnek kodu uygulamanıza ekleyin ve çalıştırın. Sonucu görmek için, sonuçlar sütununda listelenen alanları uygulamanızda bir sayfaya ekleyin.
Amounts:
Load
Date#(Month,'YYYY-MM') as Month,
Amount,
Peek(Amount) as AmountMonthBefore
Inline
[Month,Amount
2022-01,2
2022-02,3
2022-03,7
2022-04,9
2022-05,4
2022-06,1];
Sonuç tablosu
Amount
AmountMonthBefore
Ay
1
4
2022-06
2
-
2022-01
3
2
2022-02
4
9
2022-05
7
3
2022-03
9
7
2022-04
AmountMonthBefore alanı, önceki ayın tutarını içerir.
Burada, row_no ve table_name parametreleri çıkarıldığından varsayılan değerler kullanılmaktadır. Bu örnekte, aşağıdaki üç fonksiyon çağrısı eşdeğerdir:
Peek(Amount)
Peek(Amount,-1)
Peek(Amount,-1,'Amounts')
row_no değeri olarak -1 kullanılması, önceki satırdaki değerin kullanılacağı anlamına gelir. Bu değer değiştirilerek tablodaki başka satırların değerleri getirilebilir:
Peek(Amount,2) tablodaki 7 olan üçüncü değeri döndürür.
Örnek 4
Doğru sonucun alınması için verilerin doğru sıralanması gerekir ancak maalesef durum her zaman böyle değildir. Dahası, Peek() fonksiyonu henüz yüklenmemiş verilere başvurmak için kullanılamaz. Geçici tablolar kullanarak ve verinin üzerinden birden çok kez geçerek bu tür sorunlardan kaçınılabilir.
Örnek kodu uygulamanıza ekleyin ve çalıştırın. Sonucu görmek için, sonuçlar sütununda listelenen alanları uygulamanızda bir sayfaya ekleyin.
tmp1Amounts:
Load * Inline
[Month,Product,Amount
2022-01,B,3
2022-01,A,8
2022-02,B,4
2022-02,A,6
2022-03,B,1
2022-03,A,6
2022-04,A,5
2022-04,B,5
2022-05,B,6
2022-05,A,7
2022-06,A,4
2022-06,B,8];
tmp2Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthBefore
Resident tmp1Amounts
Order By Product, Month Asc;
Drop Table tmp1Amounts;
Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthAfter
Resident tmp2Amounts
Order By Product, Month Desc;
Drop Table tmp2Amounts;
Açıklama
İlk tablo aya göre sıralandığından peek() fonksiyonu çoğu durumda yanlış ürünün tutarını döndürecektir. Bu nedenle tablonun yeniden sıralanması gerekir. Bu, verinin üzerinden ikinci bir kez daha geçip tmp2Amounts adlı yeni bir tablo oluşturularak yapılır. Order By cümlesine dikkat edin. Ürünleri önce ürüne göre, sonra ayar göre artan düzende sıralar.
If() fonksiyonu gereklidir çünkü AmountMonthBefore yalnızca önceki satır aynı ürünün önceki ay için verisini içeriyorsa hesaplanmalıdır. Geçerli satırdaki ürün önceki satırdaki ürünle karşılaştırılarak bu koşul doğrulanabilir.
İkinci tablo oluşturulduğunda, birinci tablo tmp1Amounts bir Drop Table cümlesi kullanılarak bırakılır.
Son olarak, verilerin üzerinden üçüncü bir kez daha, ancak bu kez aylar ters düzende sıralanmış olarak geçilir. Bu şekilde, AmountMonthAfter da hesaplanabilir.
Bilgi notuOrder By cümleleri tablonun nasıl sıralanacağını belirtir; bunlar olmadan Peek() fonksiyonu dahili tabloda hangi rasgele sıralama varsa onu kullanır ve bu beklenmedik sonuçlar ortaya çıkarabilir.
Sonuç
Sonuç tablosu
Ay
Product
Amount
AmountMonthBefore
AmountMonthAfter
2022-01
A
8
-
6
2022-02
B
3
-
4
2022-03
A
6
8
6
2022-04
B
4
3
1
2022-05
A
6
6
5
2022-06
B
1
4
5
2022-01
A
5
6
7
2022-02
B
5
1
6
2022-03
A
7
5
4
2022-04
B
6
5
8
2022-05
A
4
7
-
2022-06
B
8
6
-
Örnek 5
Örnek kodu uygulamanıza ekleyin ve çalıştırın. Sonucu görmek için, sonuçlar sütununda listelenen alanları uygulamanızda bir sayfaya ekleyin.
Yükleme ifadesi Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal, önceki değerlerin geçerli değere eklendiği yinelemeli bir çağrı içerir. Bu işlem, komut dosyasındaki bir değer toplamını hesaplamak için kullanılır.