Conferência Mundial QlikWorld 2020. Junte-se a nós para descobrir como tirar o máximo proveito dos seus dados. Atuar rápido. Registrar agora e salvar.

Criando um intervalo de datas a partir de uma única data

Às vezes, os intervalos de tempo não são armazenados de forma explícita com um início e um término. Em vez disso, eles estão implícitos por apenas um campo – o carimbo de hora da alteração.

Poderia ser exatamente como mostrado na tabela abaixo, na qual temos taxas de câmbio para várias moedas. Cada alteração na taxa de câmbio está em sua própria linha; cada uma com uma nova taxa de conversão. Além disso, a tabela contém linhas com datas vazias correspondentes à taxa de conversão inicial, antes da primeira alteração feita.

Taxas atuais
Moeda Data de alteração Rate
EUR - 8.59
EUR 28/01/2013 8.69
EUR 15/02/2013 8.45
Dólar americano - 6.50
Dólar americano 10/01/2013 6.56
Dólar americano 03/02/2013 6.30

A tabela acima define um conjunto de intervalos não sobrepostos, no qual a data de início é chamada Change Date (Data de alteração) e a data de término é definida pelo início do próximo intervalo. Contudo, já que a data de término não está explicitamente armazenada em uma coluna própria, precisamos criar essa coluna, para que a nova tabela torne-se uma lista de intervalos.

Faça o seguinte:

  1. Crie um novo aplicativo e nomeie-o.
  2. Adicione uma nova seção de script no Editor de carregamento de dados.
  3. Adicione a tabela inline seguinte. Certifique-se de que as datas na coluna Change Date estejam no mesmo formato da data local.
  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. Determine com qual intervalo de tempo você deseja trabalhar. O início do intervalo deve ser antes da primeira data dos dados e o final do intervalo deve ser após a última.

    Adicione o seguinte à parte superior de seu script:

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

  6. Carregue os dados de origem, mas altere as datas vazias para o início do intervalo definido no ponto anterior. A data de alteração deve ser carregada como From Date (Data de início).

    Classifique a tabela primeiro de acordo com Currency (Moeda) e, em seguida, de acordo com From Date (Data de início), de forma descendente para que as últimas datas sejam exibidas na parte superior.

    Adicione o seguinte após a tabela In_Rates:

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

  7. Execute uma segunda passagem de dados onde será calculadoTo Date (Data de término). Se o registro atual tiver uma moeda diferente do registro anterior, ele será o primeiro registro de uma nova moeda (mas seu último intervalo); portanto, você deve usar o final do intervalo definido na primeira etapa. Se ele tiver a mesma Moeda, você deve retirar From Date (Data de início) do registro anterior, subtrair uma pequena quantidade de tempo e usar esse valor como To Date (Data de término) no registro atual.

    Adicione o seguinte após a tabela 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. Seu script deve ter a seguinte aparência:

    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;

O script atualizará a tabela de origem da seguinte maneira:

Tabela de origem atualizada
Moeda Rate FromDate ToDate
EUR 8.45 15/02/2013 vEndTime
EUR 8.69 28/01/2013 14/02/2013 23:59:59
EUR 8.59 vBeginTime 28/01/2013 23:59:99
Dólar americano 6.30 03/02/2013 vEndTime
Dólar americano 6.56 10/01/2013 2/02/2013 23:59:59
Dólar americano 6.50 vBeginTime 9/01/2013 23:59:59

Em seu aplicativo, a tabela tem a seguinte aparência:

Visualização de dados
Moeda Rate FromDate ToDate
EUR 8.45 15/02/2013 01/03/2013
EUR 8.69 28/01/2013 14/02/2013
EUR 8.59 01/01/2013 28/01/2013
Dólar americano 6.30 03/02/2013 01/03/2013
Dólar americano 6.56 10/01/2013 2/02/2013
Dólar americano 6.50 01/01/2013 9/01/2013

Esta tabela pode ser posteriormente utilizada em uma comparação com uma data atual com o método Intervalmatch.