Emparejar intervalos con datos discretos
El prefijo intervalmatch delante de una sentencia LOAD o SELECT sirve para enlazar valores numéricos con uno o más intervalos numéricos. Es una utilidad muy potente que se puede utilizar, por ejemplo, en entornos de producción, como se muestra en el ejemplo inferior.
Ejemplo:
Observe las tablas inferiores. La primera tabla muestra el inicio y el final de la producción de diferentes pedidos. La segunda tabla contiene algunos eventos discretos. ¿Cómo podemos asociar los eventos discretos con los pedidos para saber por ejemplo qué cambio afecta a qué pedidos y qué pedidos se procesaron a causa de qué cambios?
Inicio | Fin | Pedido |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Hora | Evento | Comentario |
---|---|---|
00:00 | 0 | Inicio de Turno 1 |
01:18 | 1 | Fin de línea |
02:23 | 2 | Reinicio de línea 50% |
04:15 | 3 | Velocidad de línea 100% |
08:00 | 4 | Inicio de Turno 2 |
11:43 | 5 | Fin de la producción |
Primero hay que cargar las dos tablas como de costumbre, y después vincular el campo Time a los intervalos definidos por los campos Start y End:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
Ahora puede crear una tabla en QlikView como se muestra a continuación:
Ahora podemos ver fácilmente que la interrupción del servicio de autobuses afectó principalmente al pedido A, pero que la reducción en la velocidad de la línea de autobuses afectó también a los pedidos B y C. Solo los pedidos C y D fueron manejados en parte por Shift 2.
Tenga en cuenta los puntos siguientes cuando utilice intervalmatch:
- Antes de la sentencia intervalmatch debe haberse leído en QlikView el campo que contiene los puntos de datos discretos (el campo Time en el ejemplo anterior). ¡La sentencia intervalmatch no lee este campo desde la tabla de la base de datos!
- La tabla leída en la sentencia intervalmatch LOAD o SELECT debe contener siempre exactamente dos campos (Start y End en el ejemplo anterior). Con el fin de establecer un vínculo a otros campos, deben leerse los campos de intervalo junto con los campos adicionales en una sentencia LOAD o SELECT aparte (la primera sentencia SELECT en el ejemplo anterior).
- Los intervalos están siempre cerrados, es decir, los puntos finales están incluidos en el intervalo. Los límites no numéricos provocan que se descarte el intervalo (indefinido) mientras que los límites NULL amplían el intervalo indefinidamente (sin límite).
- Los intervalos pueden solaparse y los valores discretos se enlazarán con todos los intervalos coincidentes.
Utilizar la sintaxis ampliada de intervalmatch para resolver problemas de cambios de dimensión progresivos
La sintaxis ampliada de intervalmatch puede emplearse para gestionar el conocido problema del cambio de dimensión progresivo en las fuentes de datos.
Script a modo de ejemplo:
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;
La sentencia nullinterpret solo es necesaria cuando se leen datos desde un archivo de tabla, ya que los valores perdidos se definen como cadenas vacías, en lugar de valores NULL.
Si cargamos los datos desde una tabla IntervalTable dará como resultado la siguiente tabla:
Clave | Primera fecha | Equipo |
---|---|---|
000110 | 2011-01-21 | Suroeste |
000110 | - | Noroeste |
000120 | - | Noroeste |
000120 | 2013-03-05 | Suroeste |
000120 | 2013-03-05 | Noroeste |
000120 | 2013-01-06 | Suroeste |
La sentencia nullasvalue permite que los valores NULL se enlacen con los valores de la lista.
Crear Key, FirstDate, LastDate, (campos de atributo) empleando previous y order by y por lo tanto IntervalTable se elimina siendo reemplazado por esta tabla clave.
Si cargamos los datos desde una tabla Transact dará como resultado la siguiente tabla:
Clave | Nombre | Fecha | Ventas |
---|---|---|---|
000110 | Rodríguez Javier | 2009-08-18 | 100 |
000110 | Rodríguez Javier | 2009-12-25 | 200 |
000110 | Rodríguez Javier | 2011-02-03 | 300 |
000110 | Rodríguez Javier | 2011-05-05 | 400 |
000120 | Díaz Juan | 2011-06-04 | 500 |
000120 | Díaz Juan | 2013-01-20 | 600 |
000120 | Díaz Juan | 2013-03-10 | 700 |
000120 | Díaz Juan | 2013-03-13 | 800 |
000120 | Díaz Juan | 2013-09-21 | 900 |
La sentencia intervalmatch precedida por inner join remplaza la clave de arriba por una clave sintética que conecta con la tabla Transact, dando como resultado la siguiente tabla:
Clave | Equipo | Nombre | Primera fecha | Última fecha | Fecha | Ventas |
---|---|---|---|---|---|---|
000110 | Noroeste | Rodríguez Javier | - | 2011-01-20 | 2009-08-18 | 100 |
000110 | Noroeste | Rodríguez Javier | - | 2011-01-20 | 2009-12-25 | 200 |
000110 | Suroeste | Rodríguez Javier | 2011-01-21 | - | 2011-02-03 | 300 |
000110 | Suroeste | Rodríguez Javier | 2011-01-21 | - | 2011-05-05 | 400 |
000120 | Noroeste | Díaz Juan | - | 2013-01-05 | 2011-06-04 | 500 |
000120 | Suroeste | Díaz Juan | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
000120 | Suroeste | Díaz Juan | 2013-03-05 | - | 2013-03-10 | 700 |
000120 | Suroeste | Díaz Juan | 2013-03-05 | - | 2013-03-13 | 800 |
000120 | Suroeste | Díaz Juan | 2013-03-05 | - | 2013-09-21 | 900 |