Correspondendo intervalos a dados discretos
O prefixo intervalmatch de um comando LOAD ou SELECT é usado para vincular valores numéricos discretos a um ou mais intervalos numéricos. Esse recurso é muito útil e pode ser usado, por exemplo, em ambientes de produção, conforme demonstrado no exemplo a seguir.
Exemplo:
Examine as duas tabelas a seguir. A primeira tabela mostra o início e o final da produção de pedidos diferentes. A segunda tabela mostra alguns eventos discretos. Como podemos associar os eventos discretos aos pedidos, de forma que saibamos, por exemplo, que pedidos foram afetados pelas interferências e que pedidos foram processados por quais turnos?
Iniciar | End | Ordenar |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Hora | Evento | Comentário |
---|---|---|
00:00 | 0 | Começo do turno 1 |
01:18 | 1 | Parada de linha |
02:23 | 2 | Reinício da linha 50% |
04:15 | 3 | Velocidade da linha 100% |
08:00 | 4 | Começo do turno 2 |
11:43 | 5 | Fim da produção |
Primeiro, carregue as duas tabelas da forma habitual e, em seguida, vincule o campo Time aos intervalos definidos pelos campos Start e End:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
Agora você pode criar uma tabela no QlikView, como mostrado abaixo:
Podemos observar, principalmente, que o pedido A foi afetado pela interrupção da linha, mas que a velocidade reduzida da linha afetou também os pedidos B e C. Somente os pedidos C e D foram parcialmente tratados pelo Shift 2.
Observe o seguinte ao utilizar o comando intervalmatch:
- Antes do comando intervalmatch o campo que contém os pontos de dados discretos (Time no exemplo acima) já deve ter sido lido no QlikView. O próprio comando intervalmatch não lê esse campo da tabela do banco de dados.
- A tabela lida no comando intervalmatch LOAD ou SELECT deve sempre conter exatamente dois campos (Start e End no exemplo apresentado). Para estabelecer um link com outros campos, é necessário ler os campos de intervalo com campos adicionais em um campo LOAD ou SELECT separado (o primeiro comando SELECT no exemplo apresentado).
- Os intervalos estão sempre fechados, isto é, sempre contêm pontos de extremidade. Os limites não numéricos fazem com que o intervalo seja desconsiderado (indefinido) e os limites NULL estendem o intervalo indefinidamente (ilimitado).
- Os intervalos podem estar sobrepostos e os valores discretos estarão vinculados a todos os intervalos correspondentes.
Usando a sintaxe intervalmatch estendida para resolver problemas de lentidão durante a alteração de dimensões
A sintaxe intervalmatch estendida pode ser utilizada para tratar o problema já conhecido de lentidão durante a alteração de dimensões na fonte de dados.
Script de amostra:
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;
O comando nullinterpret é exigido apenas na leitura de dados de um arquivo de tabela, pois os valores ausentes são definidos como caracteres vazios em vez de valores NULL.
O carregamento dos dados de IntervalTable resultaria na seguinte tabela:
Chave | FirstDate | Equipe |
---|---|---|
000110 | 2011-01-21 | Sudoeste |
000110 | - | Noroeste |
000120 | - | Noroeste |
000120 | 2013-03-05 | Sudoeste |
000120 | 2013-03-05 | Noroeste |
000120 | 2013-01-06 | Sudoeste |
O comando nullasvalue permite que os valores NULL sejam mapeados para os campos listados.
Crie Key, FirstDate, LastDate (campos de atributos) usando previous e order by. Posteriormente, IntervalTable é eliminada e substituída por essa tabela de chave.
O carregamento dos dados de Transact resultaria na seguinte tabela:
Chave | Nome | Data | Vendas |
---|---|---|---|
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 |
O comando intervalmatch precedido por inner join substitui a chave por uma chave sintética que se conecta à tabela Transact, resultando na seguinte tabela:
Chave | Equipe | Nome | FirstDate | LastDate | Data | Vendas |
---|---|---|---|---|---|---|
000110 | Noroeste | Spengler Aaron | - | 2011-01-20 | 2009-08-18 | 100 |
000110 | Noroeste | Spengler Aaron | - | 2011-01-20 | 2009-12-25 | 200 |
000110 | Sudoeste | Spengler Aaron | 2011-01-21 | - | 2011-02-03 | 300 |
000110 | Sudoeste | Spengler Aaron | 2011-01-21 | - | 2011-05-05 | 400 |
000120 | Noroeste | Ballard John | - | 2013-01-05 | 2011-06-04 | 500 |
000120 | Sudoeste | Ballard John | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
000120 | Sudoeste | Ballard John | 2013-03-05 | - | 2013-03-10 | 700 |
000120 | Sudoeste | Ballard John | 2013-03-05 | - | 2013-03-13 | 800 |
000120 | Sudoeste | Ballard John | 2013-03-05 | - | 2013-09-21 | 900 |