Aralıkları ve yinelemeli yüklemeyi eşleştirme
Bir LOAD veya SELECT deyimine yönelik Intervalmatch öneki, ayrık sayısal değerleri bir veya daha fazla sayısal aralığa bağlamak için kullanılır. Bu, örneğin üretim ortamlarında kullanılabilen oldukça etkili bir özelliktir.
IntervalMatch() önekini kullanma
En temel aralık eşleşmesi, tek bir tabloda sayıların ve tarihlerin listesine ve ikinci bir tabloda aralıkların listesine sahip olduğunuzda gerçekleştirilir. Amaç, iki tabloyu bağlamaktır. Genel olarak arada çokluk ilişkisi vardır; yani aralığa ait birçok tarih olabilir ve tarih ise birçok aralığa ait olabilir. Bunu çözmek için iki orijinal tablo arasında bir köprü tablosu oluşturmanız gerekir. Bunu yapmanın birçok yolu vardır.
Qlik Sense uygulamasında bunu çözmenin en kolay yolu, LOAD veya SELECT deyiminin önünde IntervalMatch() önekini kullanmaktır. LOAD/SELECT deyiminin yalnızca iki alanı içermesi gerekir: Aralıkları tanımlayan From ve To alanları. IntervalMatch() öneki, yüklenen aralıklar ile daha önce yüklenmiş ve önekin parametresi olarak belirtilmiş sayısal alan arasında tüm kombinasyonları oluşturacaktır.
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.
- Events bölümlerini çağırın.
-
Sağ menüdeki DataFiles altında Veri seç'e tıklayın.
- Karşıya yükleyin ve ardından Events.txt öğesini seçin.
- Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
- Karşıya yükleyin ve ardından Intervals.txt öğesini seçin.
- Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
- Kodda, ilk tabloyu Events olarak adlandırın ve ikinci tabloyu Intervals olarak adlandırın.
- İlk iki tablo arasında köprü olan üçüncü bir tablo oluşturmak için kod sonuna IntervalMatch ekleyin:
- Kodunuz şöyle görünmelidir:
- Verileri yükle'ye tıklayın.
- Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
- Olay başına tam olarak bir kayıt içeren Events tablosu.
- Aralık başına tam olarak bir kayıt içeren Intervals tablosu.
- Olay ve aralık kombinasyonu başına tam olarak bir kayıt içeren ve önceki iki tabloyu bağlayan köprü tablosu.
BridgeTable:
IntervalMatch (EventDate)
LOAD distinct IntervalBegin, IntervalEnd
Resident Intervals;
Events:
LOAD
EventID,
EventDate,
EventAttribute
FROM [lib://DataFiles/Events.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
Intervals:
LOAD
IntervalID,
IntervalAttribute,
IntervalBegin,
IntervalEnd
FROM [lib://DataFiles/Intervals.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
BridgeTable:
IntervalMatch (EventDate)
LOAD distinct IntervalBegin, IntervalEnd
Resident Intervals;
Veri modeli, Qlik Sense yapay anahtarı olarak gösterilecek bileşik anahtar (IntervalBegin ve IntervalEnd alanları) içerir.
Temel tablolar şunlardır:
Aralıklar çakışıyorsa olay birkaç aralığa ait olabilir. Bir aralığın da ona ait birkaç olayı olabilir.
Bu veri modeli, normalleştirildiği ve kompakt olduğu için optimumdur. Hem Events tablosu hem de Intervals tablosu değiştirilmemiştir ve orijinal sayıda kayıt içerir. Bu tablolarda çalışan Count(EventID) gibi tüm Qlik Sense hesaplamaları doğru şekilde çalışacak ve değerlendirilecektir.
While döngüsü ve IterNo() yinelemeli yüklemesi kullanma
While döngüsü ve aralığın alt ve üst sınırları arasında numaralandırılabilir değerler oluşturan IterNo() kullanarak neredeyse aynı köprü tablosunu elde edebilirsiniz.
While cümlesi kullanılarak LOAD deyiminin içinde bir döngü oluşturulabilir: Örneğin:
Böyle bir LOAD deyimi, her giriş kaydının üzerinde döngüye girecek ve While cümledeki ifade doğru olduğu sürece bunu tekrar tekrar yükleyecektir. IterNo() fonksiyonu ilk yinelemede “1”i ve ikincide “2”yi döndürür (bu düzende devam eder).
Aralıklar için birincil IntervalID anahtarınız vardır, bu nedenle koddaki tek fark köprü tablosunun nasıl oluşturulduğudur:
Aşağıdakileri yapın:
- Mevcut Bridgetable deyimlerini aşağıdaki kodla değiştirin:
- Verileri yükle'ye tıklayın.
- Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
- Kodunuzun sonuna şu kodu ekleyin:
- Verileri yükle'ye tıklayın.
- Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
BridgeTable:
LOAD distinct * Where Exists(EventDate);
LOAD IntervalBegin + IterNo() - 1 as EventDate, IntervalID
Resident Intervals
While IntervalBegin + IterNo() - 1 <= IntervalEnd;
Genel olarak üç tablolu çözüm, aralıklar ve olaylar arasında çokluk ilişkisine imkan tanıdığı için en ideal olandır. Ancak bir olayın yalnızca tek bir aralığa ait olabileceğini bilmeniz de sık karşılaşılan bir durumdur. Bu durumda köprü tablosu gerekli değildir. IntervalID doğrudan olay tablosunda depolanabilir. Bunu yapmanın birkaç yolu vardır, ancak en kullanışlı olanı Bridgetable öğesini Events tablosuyla birleştirmektir.
Join (Events)
LOAD EventDate, IntervalID
Resident BridgeTable;
Drop Table BridgeTable;
Açık ve kapalı aralıklar
Bir aralığın açık veya kapalı olduğu, uç noktalarının aralığa dahil olup olmasına göre belirlenir.
- Uç noktaları dahilse, kapalı bir aralıktır:
- Uç noktaları dahil değilse, açık bir aralıktır:
- Bir uç noktası dahilse, yarı açık bir aralıktır:
[a,b] = {x ∈ ℝ ∣ a ≤ x ≤ b}
]a,b[ = {x ∈ ℝ ∣ a < x < b}
[a,b[ = {x ∈ ℝ ∣ a ≤ x < b}
Aralıkların çakıştığı ve bir sayının birden fazla aralığa ait olabileceği bir durumla karşılaşırsanız, genellikle kapalı aralıkları kullanmanız gerekir.
Ancak, bazı durumlarda çakışan aralıklar istemezsiniz, bir sayının yalnızca bir aralığa ait olmasını istersiniz. Bu nedenle, bir nokta aralığın sonundaysa ve aynı anda diğerinin başındaysa bir sorunla karşılaşırsınız. Bu değere sahip bir sayı, iki aralığa da bağlanabilir. Bu nedenle, yarı açık aralıklar istersiniz.
Bu sorunun pratik bir çözümü, tüm aralıkların son değerinden çok küçük bir miktarı çıkarmak ve böylece kapalı, çakışmayan aralıklar oluşturmaktır. Sayılarınız tarihse, bunu yapmanın en kolay yolu günün son milisaniyesini döndüren DayEnd() fonksiyonunu kullanmaktır:
Küçük bir miktarı manuel olarak da çıkarabilirsiniz. Bunu yaparsanız, işlem 52 anlamlı ikili basamağa (14 ondalık basamak) yuvarlanacağı için çıkarılan miktarın çok küçük olmadığından emin olun. Çok küçük bir miktar kullanırsanız fark çok önemli olmayacak ve orijinal sayıyı tekrar kullanacaksınız.