# Dopasowywanie interwałów do danych dyskretnych

Prefiks intervalmatch przed instrukcją LOAD lub SELECT służy do powiązania dyskretnych wartości liczbowych z dowolną liczbą interwałów liczbowych. Jest to funkcja o ogromnych możliwościach, która może być stosowana na przykład w środowisku produkcyjnym, co zilustrowano poniżej.

Przykład:

Przyjrzyjmy się poniższym dwóm tabelom. Pierwsza tabela przedstawia początek i koniec produkcji różnych zamówień. Druga tabela przedstawia pewne dyskretne wydarzenia. Należy powiązać dyskretne wydarzenia z zamówieniami, aby na przykład ustalić zmianę realizującą każde zamówienie lub stwierdzić, których zamówień dotyczyły zakłócenia.

Tabela OrderLog

| Początek | End | Kolejność |
| --- | --- | --- |
| 01:00 | 03:35 | A |
| 02:30 | 07:58 | B |
| 03:04 | 10:27 | C |
| 07:23 | 11:43 | D |

Tabela EventLog

| Godzina | Zdarzenie | Komentarz |
| --- | --- | --- |
| 00:00 | 0 | Start of shift 1 |
| 01:18 | 1 | Line stop |
| 02:23 | 2 | Line restart 50% |
| 04:15 | 3 | Line speed 100% |
| 08:00 | 4 | Start of shift 2 |
| 11:43 | 5 | End of production |

Najpierw należy zatem w zwykły sposób załadować obie tabele, a następnie powiązać pole Time z interwałami wyznaczonymi przez wartości pól Start i End:

`SELECT * from OrderLog;` `SELECT * from EventLog;` `Intervalmatch (Time) SELECT Start,End from OrderLog;`

Następnie można już utworzyć tabelę w QlikView w sposób przedstawiony poniżej:

![A table in QlikView combining the above tables.](https://help.qlik.com/pl-PL/qlikview/September2026/Subsystems/Client/Content/Resources/Images/ui_gen_IntervalMatch.png)

Teraz wyraźnie widać, że zatrzymanie linii miało wpływ głównie na zamówienie A, ale zmniejszona prędkość linii wpłynęła również na zamówienia B i C. Tylko zamówienia C i D były częściowo obsłużone przez Shift 2.

W przypadku korzystania z prefiksu intervalmatch należy pamiętać o następujących kwestiach:

* Pole zawierające dyskretne punkty danych (w powyższym przykładzie jest to pole Time) musi być wczytane do QlikView przed wykonaniem instrukcji intervalmatch. Instrukcja intervalmatch nie odczytuje tego pola z tabeli w bazie danych.
* Tabela wczytywana instrukcją intervalmatch LOAD lub SELECT musi zawsze zawierać dokładnie dwa pola (w powyższym przykładzie są to pola Start i End). Aby było możliwe utworzenie powiązania z innymi polami, konieczne jest wczytanie pól interwałów wraz z polami dodatkowymi w ramach osobnej instrukcji LOAD lub SELECT (w powyższym przykładzie jest to pierwsza instrukcja SELECT).
* Interwały te są zawsze zamknięte, co oznacza, że punkty końcowe są zawarte w interwale. Podanie limitów nieliczbowych powoduje odrzucenie interwału (niezdefiniowany), natomiast limity równe NULL oznaczają nieograniczone rozszerzenie interwału.
* Interwały mogą na siebie zachodzić, a wartości dyskretne zostaną powiązane ze wszystkimi pasującymi interwałami.

## Korzystanie z rozszerzonej składni prefiksu intervalmatch w celu rozwiązywania problemów z powoli zmieniającymi się wymiarami

Za pomocą rozszerzonej składni prefiksu intervalmatch można skutecznie rozwiązać dobrze znany problem powoli zmieniających się wymiarów w danych źródłowych.

### Przykładowy skrypt:

`SET NullInterpret='';` ` ` `IntervalTable:
` `LOAD
    Key,
    ValidFrom,
    Team
from IntervalTable.xls;` `NullAsValue FirstDate,LastDate;` ` ` `Key:` `LOAD` `Key,` `ValidFrom as FirstDate,` `date(if(Key=previous(Key),` `previous(ValidFrom) - 1)) as LastDate,` `Team` `RESIDENT IntervalTable order by Key, ValidFrom desc;` ` ` `drop table IntervalTable;` ` ` `Transact:` `LOAD Key, Name, Date, Sales from Transact.xls;` ` ` `INNER JOIN intervalmatch (Date,Key) LOAD FirstDate, LastDate, Key RESIDENT Key;`

Instrukcja nullinterpret jest wymagana jedynie w przypadku ładowania danych z pliku tabeli, ponieważ w tym przypadku brakujące wartości są zdefiniowane jako puste ciągi znaków, a nie wartości NULL.

Załadowanie danych z tabeli IntervalTable dałoby w wyniku następującą tabelę:

Przykładowa tabela 1

| Klucz | FirstDate | Team |
| --- | --- | --- |
| 000110 | 2011-01-21 | Southwest |
| 000110 | - | Northwest |
| 000120 | - | Northwest |
| 000120 | 2013-03-05 | Southwest |
| 000120 | 2013-03-05 | Northwest |
| 000120 | 2013-01-06 | Southwest |

Instrukcja nullasvalue pozwala na odwzorowanie wartości NULL na wymienione pola.

Następnie należy utworzyć pola atrybutów Key, FirstDate i LastDate za pomocą instrukcji previous i order by, po czym tabela IntervalTable zostanie zastąpiona tabelą klucza i usunięta.

Załadowanie danych z tabeli Transact dałoby w wyniku następującą tabelę:

Przykładowa tabela 2

| Klucz | Nazwa | Data | Sales |
| --- | --- | --- | --- |
| 000110 | Spengler Aaron | 2009-08-18 | 100 |
| 000110 | Spengler Aaron | 2009-12-25 | 200 |
| 000110 | Spengler Aaron | 2011-02-03 | 300 |
| 000110 | Spengler Aaron | 2011-05-05 | 400 |
| 000120 | Ballard John | 2011-06-04 | 500 |
| 000120 | Ballard John | 2013-01-20 | 600 |
| 000120 | Ballard John | 2013-03-10 | 700 |
| 000120 | Ballard John | 2013-03-13 | 800 |
| 000120 | Ballard John | 2013-09-21 | 900 |

Instrukcja intervalmatch poprzedzona klauzulą inner join zastępuje powyższy klucz kluczem syntetycznym, który tworzy połączenie z tabelą Transact. W efekcie powstaje następująca tabela:

Przykładowa tabela 3

| Klucz | Team | Nazwa | FirstDate | LastDate | Data | Sales |
| --- | --- | --- | --- | --- | --- | --- |
| 000110 | Northwest | Spengler Aaron | - | 2011-01-20 | 2009-08-18 | 100 |
| 000110 | Northwest | Spengler Aaron | - | 2011-01-20 | 2009-12-25 | 200 |
| 000110 | Southwest | Spengler Aaron | 2011-01-21 | - | 2011-02-03 | 300 |
| 000110 | Southwest | Spengler Aaron | 2011-01-21 | - | 2011-05-05 | 400 |
| 000120 | Northwest | Ballard John | - | 2013-01-05 | 2011-06-04 | 500 |
| 000120 | Southwest | Ballard John | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
| 000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-03-10 | 700 |
| 000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-03-13 | 800 |
| 000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-09-21 | 900 |