Kayıtlar arası fonksiyonları kullanma: Peek, Previous ve Exists
Bu fonksiyonlar, geçerli kaydın değerlendirilmesi için verilerin daha önceden yüklenmiş kayıtlarından bir değere ihtiyaç duyulduğunda kullanılır.
Dersin bu bölümünde, Peek(), Previous() ve Exists() fonksiyonlarını inceleyeceğiz.
Peek()
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.
Söz Dizimi:
Satır, bir tamsayı olmalıdır. 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.
Herhangi bir satır belirtilmemişse, -1 kabul edilir.
Tablename sonunda iki nokta üst üste olmayan tablo etiketidir. tablename belirtilmezse geçerli tablo olduğu varsayılır. LOAD deyimi dışında kullanılırsa veya başka bir tabloya referansta bulunursa tablename dahil edilmelidir.
Previous()
Previous(), where cümlesi nedeniyle atılmamış önceki bir giriş kaydındaki verileri kullanarak expr ifadesinin değerini bulur. Bir iç tablonun ilk kaydında, bu fonksiyon NULL sonucunu döndürür.
Söz Dizimi:
Previous() fonksiyonu daha gerideki kayıtlara erişmek için iç içe geçirilebilir. Veriler, ilişkilendirilmiş veritabanında saklanmasa bile doğrudan giriş kaynağından alınır ve böylece Qlik Sense uygulamasına yüklenmemiş alanlara bile referansta bulunmayı mümkün kılar.
Exists()
Exists(), veri kod dosyasında alana daha önce belirli bir alan değerinin yüklenip yüklenmediğini belirler. Fonksiyon TRUE ya da FALSE sonucunu döndürdüğünden, bir LOAD deyiminin veya bir IF deyiminin where cümlesinde kullanılabilir.
Söz Dizimi:
Alan, kod tarafından yüklenen verilerde bulunmalıdır. Expression, belirtilen alanda aranacak alan değeri olarak değerlendiren bir ifadedir. Bu atlandığı takdirde, geçerli kaydın belirtilen alandaki değeri alınır.
Peek() ve Previous() kullanma
En basit biçimleriyle, Peek() ve Previous() bir tablo içindeki belirli değerleri tanımlamak için kullanılır. Bu alıştırmada yükleyeceğiniz Employees tablosundaki örnek verileri aşağıda bulabilirsiniz.
Tarih | İşe Alma | İşten Çıkarma |
---|---|---|
1/1/2011 | 6 | 0 |
2/1/2011 | 4 | 2 |
3/1/2011 | 6 | 1 |
4/1/2011 | 5 | 2 |
Şu anda bu, yalnızca ay, işe alma ve işten çıkarmalara yönelik verileri toplar, bu nedenle toplam çalışanlardaki aylık farkı görmek amacıyla Peek() ve Previous() fonksiyonlarını kullanarak Employee Count ve Employee Var için alanları ekleyeceğiz.
Aşağıdakileri yapın:
- Gelişmiş Kodlama Eğitimi uygulamasını açın.
- Veri yükleme düzenleyicisi'ne yeni bir kod bölümü ekleyin.
- Employees bölümünü çağırın.
-
Sağ menüdeki DataFiles altında Veri seç'e tıklayın.
- Karşıya yükleyin ve ardından Employees.xlsx öğesini seçin.
- Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
-
Kodu şöyle görünecek şekilde değiştirin:
[Employees Init]: LOAD rowno() as Row, Date(Date) as Date, Hired, Terminated, If(rowno()=1, Hired-Terminated, peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count] FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet1);
- Kodunuzun sonuna şunu ekleyin:
- Verileri yükle'ye tıklayın.
Kodunuz şöyle görünmelidir:
Excel sayfasının Date alanındaki tarihler AA/GG/YYYY biçimindedir. Tarihlerin sistem değişkenleri biçimi kullanılarak doğru şekilde yorumlanması için Date alanına Date işlevi uygulanmıştır.
Peek() fonksiyonu, belirli bir alan için yüklenmiş herhangi bir değeri tanımlamanızı sağlar. İfadede ilk olarak rowno() öğesinin 1 değerine eşit olup olmadığına bakarız. 1'e eşitse Employee Count mevcut olmayacaktır, bu nedenle alanı Hired eksi Terminated ile doldururuz.
rowno() 1'den büyükse önceki ayın Employee Count değerine bakar ve o ayın Hired değeri eksi Terminated çalışanlar sonucuna ilgili sayıyı ekleriz.
Peek() fonksiyonunda da (-1) kullandığımıza dikkat edin. Bu, Qlik Sense uygulamasına geçerli kaydın üzerindeki kayda bakmasını söyler. (-1) belirtilmezse, Qlik Sense önceki kayda bakmak istediğinizi varsayar.
[Employee Count]:
LOAD
Row,
Date,
Hired,
Terminated,
[Employee Count],
If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var]
Resident [Employees Init] Order By Row asc;
Drop Table [Employees Init];
Previous() fonksiyonu, belirli bir alan için yüklenmiş son değeri tanımlamanızı sağlar. Bu ifadede ilk olarak rowno() öğesinin 1 değerine eşit olup olmadığına bakarız. 1'e eşitse önceki ayın Employee Count değeri için hiçbir kayıt olmadığından Employee Var olmayacağını biliriz. Bu nedenle, bu değer için 0 gireriz.
rowno() 1'den büyükse, Employee Var olacağını biliriz, bu nedenle geçen ayın Employee Count değerine bakar ve Employee Var alanında değeri oluşturmak için bu sayıyı o ayın Employee Count değerinden çıkarırız.
Kodunuz şöyle görünmelidir:
[Employees Init]:
LOAD
rowno() as Row,
Date(Date) as Date,
Hired,
Terminated,
If(rowno()=1, Hired-Terminated, peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count]
FROM [lib://DataFiles/Employees.xlsx]
(ooxml, embedded labels, table is Sheet1);
[Employee Count]:
LOAD
Row,
Date,
Hired,
Terminated,
[Employee Count],
If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var]
Resident [Employees Init] Order By Row asc;
Drop Table [Employees Init];
Uygulamaya genel bakışta yeni bir sayfada, tablonun sütunları olarak Date, Hired, Terminated, Employee Count ve Employee Var kullanarak yeni bir tablo oluşturun. Sonuçta elde edilen tablo şöyle görünmelidir:
Peek() ve Previous(), bir tablo içindeki tanımlı satırları hedeflemenizi sağlar. İki fonksiyon arasındaki en büyük fark, Peek() fonksiyonunun kullanıcının daha önce koda yüklenmemiş bir alana bakmasını sağlar, Previous() fonksiyonu ise yalnızca daha önce yüklenen bir alana bakabilir. Previous(), LOAD deyiminin girdisi üzerinden, Peek() ise LOAD deyiminin çıktısı üzerinden işler. (RecNo() ile RowNo() arasındaki farkla aynıdır.) Bu, Where cümleniz varsa iki fonksiyonun farklı şekilde hareket edeceği anlamına gelir.
Bu nedenle Previous() fonksiyonu, kullanıcının önceki değerle geçerli değerin karşılaştırmasını görmesi gerektiğinde daha uygun olur. Örnekte, aydan aya çalışan farkını hesapladık.
Peek() fonksiyonu, tabloya daha önce yüklenmemiş bir alanı hedeflediğinizde veya belirli bir satırı hedeflemeniz gerektiğinde daha uygun olur. Bu, önceki ayın Employee Count değerine bakarak ve o ay işe alınan ve işten çıkarılan çalışanlar arasındaki farkı ekleyerek Employee Count değerini hesapladığımız örnekte gösterilmiştir. Employee Count alanının orijinal dosyadaki bir alan olmadığını unutmayın
Exists() kullanma
Exists() fonksiyonu, çoğu zaman veri modeline zaten ilgili veriler yüklenmişse koddaki Where cümlesiyle birlikte kullanılır.
Aşağıdaki örnekte, dizelere sayısal değerleri atamak için Dual() fonksiyonunu da kullanırız.
Aşağıdakileri yapın:
- Yeni bir uygulama oluşturun ve ona bir ad verin.
- Veri yükleme düzenleyicisi'ne yeni bir kod bölümü ekleyin.
- People bölümünü çağırın.
- Aşağıdaki kodu girin:
- Verileri yükle'ye tıklayın.
- Yeni bir sayfa oluşturun ve sayfaya bir ad verin.
- Yeni sayfayı açın ve Sayfayı düzenle'ye tıklayın.
- Sayfaya AgeBucket boyutuna sahip bir standart tablo ekleyin ve görselleştirmeye Yaş Grupları adını verin.
- AgeBucket boyutu ve Count([AgeBucket]) hesaplamasıyla sayfaya sütun grafik ekleyin. Görselleştirmeye Number of people in each age group adını verin.
- Tablonun ve sütun grafiğin özelliklerini isteğinize göre düzenleyin ve ardından Bitti seçeneğine tıklayın.
Sayfanız şöyle görünür:
//Add dummy people data
PeopleTemp:
LOAD * INLINE [
PersonID, Person
1, Jane
2, Joe
3, Shawn
4, Sue
5, Frank
6, Mike
7, Gloria
8, Mary
9, Steven,
10, Bill
];
//Add dummy age data
AgeTemp:
LOAD * INLINE [
PersonID, Age
1, 23
2, 45
3, 43
4, 30
5, 40
6, 32
7, 45
8, 54
9,
10, 61
11, 21
12, 39
];
//LOAD new table with people
People:
NoConcatenate LOAD
PersonID,
Person
Resident PeopleTemp;
Drop Table PeopleTemp;
//Add age and age bucket fields to the People table
Left Join (People)
LOAD
PersonID,
Age,
If(IsNull(Age) or Age='', Dual('No age', 5),
If(Age<25, Dual('Under 25', 1),
If(Age>=25 and Age <35, Dual('25-34', 2),
If(Age>=35 and Age<50, Dual('35-49' , 3),
If(Age>=50, Dual('50 or over', 4)
))))) as AgeBucket
Resident AgeTemp
Where Exists(PersonID);
DROP Table AgeTemp;
Kodda, Age ve AgeBucket alanları yalnızca PersonID veri modeline zaten yüklenmişse yüklenir.
AgeTemp tablosunda PersonID 11 ve 12 için listelenen yaşlar olduğuna, ancak bu kimlikler veri modelinde (People tablosunda) yüklenmediği için Where Exists(PersonID) cümlesi tarafından hariç tutulduklarına dikkat edin. Bu cümle, şu şekilde de yazılabilir: Where Exists(PersonID, PersonID).
Kodun çıktısı şu şekilde görünmelidir:
AgeTemp tablosundaki PersonID'lerin hiçbiri veri modeline yüklenmezse, Age ve AgeBucket alanları People tablosuyla birleştirilmez. Exists() fonksiyonunun kullanılması, veri modelinde artık kayıtların/verilerin, yani herhangi bir kişiyle ilişkilendirilmemiş Age ve AgeBucket alanlarının olmasını önler.
Dual() fonksiyonu, dizeye sayısal bir değer atamak gerektiğinde kodda veya grafik ifadesinde faydalı olur.
Yukarıdaki kodda yaşları yükleyen bir uygulamanız vardır ve gerçek yaşlara karşılık yaş demetlerini temel alan görselleştirmeler oluşturmak için bu yaşları demetlere ayırmaya karar verirsiniz. 25 yaşında altındaki kişiler, 25 ve 35 yaş arası kişiler, vb. yaş grupları için bir demet olur. Dual() fonksiyonu kullanılarak, yaş demetlerine daha sonra liste kutusunda veya grafikte yaş demetlerini sıralamak için kullanılabilecek sayısal bir değer atanabilir. Bu nedenle, uygulama sayfasında olduğu gibi sıralama "Yaş yok"u listenin sonuna alır.