Ana içeriğe geç

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.

  1. Yeni bir uygulama oluşturun ve ona bir ad verin.
  2. Veri yükleme düzenleyicisi'ne yeni bir kod bölümü ekleyin.
  3. Events bölümlerini çağırın.
  4. Sağ menüdeki DataFiles altında Veri seç'e tıklayın.

  5. Karşıya yükleyin ve ardından Events.txt öğesini seçin.
  6. Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
  7. Karşıya yükleyin ve ardından Intervals.txt öğesini seçin.
  8. Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
  9. Kodda, ilk tabloyu Events olarak adlandırın ve ikinci tabloyu Intervals olarak adlandırın.
  10. İlk iki tablo arasında köprü olan üçüncü bir tablo oluşturmak için kod sonuna IntervalMatch ekleyin:
  11. BridgeTable: IntervalMatch (EventDate) LOAD distinct IntervalBegin, IntervalEnd Resident Intervals;
  12. Kodunuz şöyle görünmelidir:
  13. 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;

  14. Verileri yükle'ye tıklayın.
  15. Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
  16. Veri modeli: Events, BridgeTable, Intervals ve $Syn1 tabloları

    Veri modeli:

    Veri modeli, Qlik Sense yapay anahtarı olarak gösterilecek bileşik anahtar (IntervalBegin ve IntervalEnd alanları) içerir.

    Temel tablolar şunlardı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.

    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.

Bilgi notuIntervalMatch() hakkında daha fazla bilgi almak için Qlik Community bölümündeki blog gönderisine göz atın: Using IntervalMatch() (IntervalMatch() Kullanma)

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:

LOAD Date, IterNo() as Iteration From … While IterNo() <= 4;

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:

  1. Mevcut Bridgetable deyimlerini aşağıdaki kodla değiştirin:
  2. BridgeTable: LOAD distinct * Where Exists(EventDate); LOAD IntervalBegin + IterNo() - 1 as EventDate, IntervalID     Resident Intervals     While IntervalBegin + IterNo() - 1 <= IntervalEnd;

  3. Verileri yükle'ye tıklayın.
  4. Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
  5. Veri modeli: Events, BridgeTable ve Intervals tabloları

    Veri modeli:

    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.

  6. Kodunuzun sonuna şu kodu ekleyin:
  7. Join (Events) LOAD EventDate, IntervalID Resident BridgeTable;   Drop Table BridgeTable;

  8. Verileri yükle'ye tıklayın.
  9. Veri modeli görüntüleyicisi'ni açın. Veri modeli artık şöyle görünür:
  10. Veri modeli: Events ve Intervals tabloları

    Veri modeli:

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:
  • [a,b] = {x ∈ ℝ ∣ a ≤ x ≤ b}

  • Uç noktaları dahil değilse, açık bir aralıktır:
  • ]a,b[ = {x ∈ ℝ ∣ a < x < b}

  • Bir uç noktası dahilse, yarı açık bir aralıktır:
  • [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:

Intervals: LOAD…, DayEnd(IntervalEnd – 1) as IntervalEnd From Intervals;

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.