Przeskocz do zawartości głównej Przejdź do treści uzupełniającej

Tworzenie interwałów na podstawie daty

Czasami interwały czasu nie są zapisywane jawnie z początkiem i końcem. Zamiast tego wynikają z tylko jednego pola — znacznika czasu zmiany.

Przykładem może być poniższa tabela zawierająca różne kursy walutowe. Każda zmiana kursu walutowego zachodzi we własnym wierszu — z nowym kursem wymiany. Ponadto tabela ta zawiera wiersze z pustymi datami odpowiadającymi początkowemu kursowi wymiany, przed dokonaniem pierwszej zmiany.

Kursy walut
WalutaZmień datęOcena
EUR-8.59
EUR28/01/20138.69
EUR15/02/20138.45
USD-6.50
USD10/01/20136.56
USD03/02/20136.30

Powyższa tabela definiuje zestaw niepokrywających się interwałów, gdzie data początkowa nazywana jest Change Date, a data końcowa jest definiowana przez początek następnego interwału. Data końcowa nie jest jawnie zapisywana we własnej kolumnie, musimy zatem utworzyć taką kolumnę, aby nowa tabela stała się listą interwałów.

  1. Utwórz nową aplikację i nadaj jej nazwę.
  2. Dodaj nową sekcję skryptu w edytorze ładowania danych.
  3. Dodaj następującą tabelę wbudowaną. Upewnij się, że daty w kolumnie Change Date są w tym samym formacie co lokalny format daty.
  4. In_Rates:
    LOAD * Inline [
    Currency,Change Date,Rate
    EUR,,8.59
    EUR,28/01/2013,8.69
    EUR,15/02/2013,8.45
    USD,,6.50
    USD,10/01/2013,6.56
    USD,03/02/2013,6.30
    ];
    

  5. Określ, z którego zakresu czasu chcesz korzystać. Początek zakresu musi przypadać przed pierwszą datą w danych, a koniec po ostatniej.

    Dodaj następujące elementy na początku skryptu:

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);

  6. Załaduj dane źródłowe, ale zmień puste daty na początek zakresu określonego w poprzednim punkcie. Data zmiany powinna być załadowana jako "From Date".

    Posortuj tabelę najpierw według Currency, a następnie malejąco według "From Date", aby najnowsze daty znalazły się na górze.

    Dodaj następujące elementy po tabeli In_Rates:

    Tmp_Rates:
    LOAD Currency, Rate,
        Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates;

  7. Uruchom drugie przejście przez dane, aby obliczyć "To Date". Jeśli bieżący rekord zawiera inną walutę niż poprzedni, jest to pierwszy rekord nowej waluty (ale jej ostatni interwał), należy zatem użyć końca zakresu zdefiniowanego w kroku 1. Jeśli jest to ta sama waluta, należy wziąć "From Date" z poprzedniego rekordu, odjąć niewielką ilość czasu i użyć tej wartości jako "To Date" w bieżącym rekordzie.

    Dodaj poniższe po tabeli Tmp_Rates:

    Rates:
    LOAD Currency, Rate, FromDate,
        Date(If( Currency=Peek('Currency'),
            Peek('FromDate') - $(#vEpsilon),
            $(#vEndTime)
            )) as ToDate
        Resident Tmp_Rates
        Order By Currency, FromDate Desc;
    					
    Drop Table Tmp_Rates;
    

  8. Skrypt powinien wyglądać następująco:

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);
    
    In_Rates:
    LOAD * Inline [
    Currency,Change Date,Rate
    EUR,,8.59
    EUR,28/01/2013,8.69
    EUR,15/02/2013,8.45
    USD,,6.50
    USD,10/01/2013,6.56
    USD,03/02/2013,6.30
    ];  
    
    Tmp_Rates:
    LOAD Currency, Rate,	
        Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates; 
    
    Rates:
    LOAD Currency, Rate, FromDate,	
        Date(If( Currency=Peek('Currency'),
            Peek('FromDate') - $(#vEpsilon),
            $(#vEndTime)		
            )) as ToDate	
        Resident Tmp_Rates
    Order By Currency, FromDate Desc; 
    
    Drop Table Tmp_Rates;

Skrypt zaktualizuje tabelę źródłową w następujący sposób:

Zaktualizowana tabela źródłowa
WalutaOcenaData początkowaData końcowa
EUR8.4515/02/2013vEndTime
EUR8.6928.01.201314/02/2013 23:59:59
EUR8.59vBeginTime28/01/2013 23:59:99
USD6.3002.03.2013vEndTime
USD6.5610/01/20132/02/2013 23:59:59
USD6.50vBeginTime9/01/2013 23:59:59

W Twojej aplikacji tabela wygląda następująco:

Podgląd danych
WalutaOcenaFromDateDo daty
EUR8.4515/02/201301/03/2013
EUR8,6928/01/201314/02/2013
EUR8,5901/01/201328/01/2013
USD6,3002.03.201303.01.2013
USD6,5601.10.20132/02/2013
USD6,5001.01.20139/01/2013

Tabelę tę można następnie wykorzystać do porównania z istniejącą datą przy użyciu Intervalmatch metody.

Czy ta strona była pomocna?

Jeżeli natkniesz się na problemy z tą stroną lub jej zawartością — literówkę, brakujący krok lub błąd techniczny — daj nam znać!