Correspondance entre intervalles et données discrètes
Le préfixe intervalmatch d'une instruction LOAD ou SELECT permet de lier des valeurs numériques discrètes à un ou plusieurs intervalles numériques. Il s'agit d'une fonction très puissante qui peut s'utiliser, par exemple, dans les environnements de production, comme l'illustre l'exemple ci-dessous.
Considérez les deux tables ci-dessous. La première table affiche le début et la fin de la production de différentes commandes. La seconde table affiche des événements discrets. Comment est-il possible d'associer les événements discrets aux commandes, de sorte que l'on sache, par exemple, quelles commandes ont subi des perturbations et quelles commandes ont été traitées par telle ou telle équipe ?
Début | End | Ordre |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Heure | Événement | Commentaire |
---|---|---|
00:00 | 0 | Début d'équipe 1 |
01:18 | 1 | Arrêt de ligne |
02:23 | 2 | Redémarrage de ligne 50 % |
04:15 | 3 | Vitesse de ligne 100 % |
08:00 | 4 | Début d'équipe 2 |
11:43 | 5 | Fin de production |
Chargez tout d'abord les deux tables selon la procédure habituelle, puis liez le champ Time aux intervalles définis par les champs Start et End :
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
Vous pouvez à présent créer une table dans QlikView, comme celle qui suit :
Nous voyons à présent facilement que la commande A a principalement été affectée par l'arrêt de la ligne, mais que la vitesse réduite de la ligne a également affecté les commandes B et C. Seules les commandes C et D ont été partiellement traitées par l'équipe Shift 2.
Prenez note des points suivants concernant l'utilisation de intervalmatch :
- Avant l'instruction intervalmatch, le champ contenant les points de données discrets (Time dans l'exemple ci-dessus) doit déjà avoir été lu dans QlikView. L'instruction intervalmatch ne lit pas ce champ à partir de la table de la base de données.
- La table lue dans l'instruction intervalmatch LOAD ou SELECT doit toujours contenir exactement deux champs (Start et End dans l'exemple ci-dessus). Afin d'établir un lien avec d'autres champs, vous devez lire les champs d'intervalle en même temps que les champs supplémentaires dans une instruction LOAD ou SELECT distincte (la première instruction SELECT dans l'exemple ci-dessus).
- Les intervalles sont toujours fermés, c'est-à-dire que les points de fin sont inclus dans l'intervalle. Avec des limites non numériques, l'intervalle est ignoré (indéfini) tandis qu'avec des limites NULL, il est étendu de manière indéfinie (il devient illimité).
- Les intervalles peuvent se superposer et les valeurs discrètes sont alors liées à tous les intervalles correspondants.
Résolution des problèmes de dimensions changeant progressivement à l'aide de la syntaxe intervalmatch étendue
La syntaxe intervalmatch étendue peut servir à traiter le problème bien connu des dimensions changeant progressivement dans les données source.
Échantillon de script :
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;
L'instruction nullinterpret n'est requise que lorsque le programme lit des données à partir d'un fichier de table, puisque les valeurs manquantes sont définies comme des chaînes vides plutôt que comme des valeurs NULL.
Le chargement des données à partir de IntervalTable donnerait la table suivante :
Clé | FirstDate | Équipe |
---|---|---|
000110 | 2011-01-21 | Sud-ouest |
000110 | - | Nord-ouest |
000120 | - | Nord-ouest |
000120 | 2013-03-05 | Sud-ouest |
000120 | 2013-03-05 | Nord-ouest |
000120 | 2013-01-06 | Sud-ouest |
L'instruction nullasvalue permet de mapper des valeurs NULL aux champs répertoriés.
Créez les champs d'attribut Key, FirstDate, LastDate à l'aide de previous et order by ; la table IntervalTable est alors abandonnée et remplacée par cette table de clés.
Le chargement des données à partir de Transact donnerait la table suivante :
Clé | Nom | Date | Ventes |
---|---|---|---|
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 |
L'instruction intervalmatch précédée de inner join remplace la clé ci-dessus par une clé synthétique qui établit une connexion avec la table Transact, donnant ainsi la table suivante :
Clé | Équipe | Nom | FirstDate | LastDate | Date | Ventes |
---|---|---|---|---|---|---|
000110 | Nord-ouest | Spengler Aaron | - | 2011-01-20 | 2009-08-18 | 100 |
000110 | Nord-ouest | Spengler Aaron | - | 2011-01-20 | 2009-12-25 | 200 |
000110 | Sud-ouest | Spengler Aaron | 2011-01-21 | - | 2011-02-03 | 300 |
000110 | Sud-ouest | Spengler Aaron | 2011-01-21 | - | 2011-05-05 | 400 |
000120 | Nord-ouest | Ballard John | - | 2013-01-05 | 2011-06-04 | 500 |
000120 | Sud-ouest | Ballard John | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
000120 | Sud-ouest | Ballard John | 2013-03-05 | - | 2013-03-10 | 700 |
000120 | Sud-ouest | Ballard John | 2013-03-05 | - | 2013-03-13 | 800 |
000120 | Sud-ouest | Ballard John | 2013-03-05 | - | 2013-09-21 | 900 |