Emparejar intervalos con datos discretos
El prefijo intervalmatch delante de una sentencia LOAD o SELECT se utiliza para enlazar valores numéricos discretos con uno o más intervalos numéricos. Es una utilidad muy potente que se puede utilizar, por ejemplo, en entornos de producción.
Ejemplo de intervalmatch
Observe las dos 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 | Orden |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Time | Evento | Comentario |
---|---|---|
00:00 | 0 | Inicio de shift 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 shift 2 |
11:43 | 5 | Fin de la producción |
Primero, cargue las dos tablas como de costumbre y después vincule 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 Qlik Sense, como se muestra a continuación:
Time | Evento | Comentario | Orden | Comienzo | End |
---|---|---|---|---|---|
0:00 | 0 | Inicio de shift 1 | - | - | - |
1:18 | 1 | Fin de línea | A | 1:00 | 3:35 |
2:23 | 2 | Reinicio de línea 50% | A | 1:00 | 3:35 |
4:15 | 3 | Velocidad de línea 100% | B | 2:30 | 7:58 |
4:15 | 3 | Velocidad de línea 100% | C | 3:04 | 10:.... |
8:00 | 4 | Inicio de shift 2 | C | 3:04 | 10:.... |
8:00 | 4 | Inicio de shift 2 | D | 7:23 | 11:.... |
11:43 | 5 | Fin de la producción | E | 7:23 | 11:..... |
Ahora podemos ver fácilmente que el pedido A se vio afectado principalmente por la parada de línea, pero que la velocidad reducida de la línea de producción también afectó a los pedidos B y C. Solo los pedidos C y D fueron gestionados en parte por Shift 2.
Tenga en cuenta los puntos siguientes cuando use intervalmatch:
- Antes de la sentencia intervalmatch, el campo que contiene los puntos de datos discretos (Time en el ejemplo superior) ya deben haberse leído en Qlik Sense. 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 siempre debe contener exactamente dos campos (Start y End en el ejemplo anterior). Para definir un enlace a otros campos, debe leer los campos de intervalo junto con campos adicionales en una sentencia aparte LOAD o SELECT (la primera sentencia SELECT en el ejemplo anterior).
- Los intervalos están siempre cerrados. Es decir, los puntos finales se incluyen en el intervalo. Los límites no numéricos hacen que se descarte el intervalo (no definido) mientras que los límites NULL amplían el intervalo indefinidamente (ilimitado).
- 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 'lib://dataqv/intervalmatch.xlsx' (ooxml, embedded labels, table is IntervalTable);
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 'lib://dataqv/intervalmatch.xlsx' (ooxml, embedded labels, table is Transact);
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 inexistentes se definen como cadenas vacías, en lugar de valores NULL.
Cargar los datos desde IntervalTable dará como resultado la siguiente tabla:
Key | FirstDate | Team |
---|---|---|
000110 | 2011-01-21 | Southwest |
000110 | - | Northwest |
000120 | - | Northwest |
000120 | 2013-03-05 | Southwest |
000120 | 2013-03-05 | Northwest |
000120 | 2013-03-05 | Southwest |
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.
Cargar los datos desde Transact dará como resultado la siguiente tabla:
Clave | Nombre | Fecha | Ventas |
---|---|---|---|
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 |
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 tabla siguiente:
Clave | Equipo | Nombre | FirstDate | LastDate | Date | Ventas |
---|---|---|---|---|---|---|
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 |