Les données dimensionnelles qui changent lentement ou de manière imprévisible sont capturées dans les analyses de dimensions à variation lente (SCD). Dans un environnement d'entrepôt de données, une table de dimension possède une clé primaire qui identifie de manière unique chaque enregistrement et d'autres informations appelées données dimensionnelles.
Toutes les méthodes de mise à jour pour les différents types de SCD peuvent être réalisées à l'aide du programme SortCL dans IRI CoSort . Dans IRI Voracity, un assistant vous aide à créer les scripts de travail SCD utilisés lors de l'exécution du programme SortCL. La plupart des types SCD utilisent une jointure externe complète pour faire correspondre les enregistrements de la source de données d'origine avec les enregistrements de la source de mise à jour en fonction de l'équivalence d'une clé de chacun. Les enregistrements avec des correspondances doivent être mis à jour dans le maître. Les enregistrements de la source de mise à jour qui n'ont pas de correspondance doivent être ajoutés au maître.
Voici un aperçu de la façon de mettre à jour un fichier dimensionnel à l'aide de SCD Type 2 où je maintiens les coûts des produits. La mise à jour est accomplie en joignant par rapport au champ ProductCode .
SCD de type 2
Dans ce modèle, les enregistrements actuels et historiques sont conservés dans le même fichier. Dans une base de données active, vous auriez probablement une clé de substitution à utiliser comme clé primaire pour la liaison aux tables de faits en plus du ProductCode clé utilisée pour le processus de mise à jour. Étant donné que les enregistrements actuels et les enregistrements historiques sont contenus dans le même fichier, il est nécessaire d'avoir un champ qui indique si l'enregistrement est l'enregistrement actuel pour le ProductCode et nous avons besoin d'un champ pour indiquer quand le coût pour le ProductCode n'est plus efficace. Dans cet exemple, nous avons :
- Code produit :Il s'agit du champ de la clé d'identification.
- Coût :Coût qui est entré en vigueur le StartDate pour mémoire.
- Date de début :il s'agit de la date à laquelle le coût de l'enregistrement est devenu effectif.
- Date de fin :Il s'agit de la date à laquelle le Coût dans le dossier n'est plus efficace. Si le coût est toujours effectif, la date de fin sera définie sur 99991231. Ceci afin d'éviter une valeur nulle dans ce champ.
- En cours :Y si le coût est toujours en vigueur, N si ce n'est pas le cas.
La table de départ a déjà 3 enregistrements d'historique. Ce sont eux qui ont la valeur N pour le champ Actuel . La source maîtresse s'appelle master2.dat et contient les données ci-dessous :
ProductCode | Coût | Date de début | Date de fin | Actuel |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Oui |
F112 | 2365.00 | 20120101 | 99991231 | Oui |
G101 | 19.25 | 20110930 | 99991231 | Oui |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 450.50 | 20110430 | 99991231 | Oui |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
S022 | 98,75 | 20110515 | 99991231 | Oui |
Les enregistrements de mise à jour ont tous la même StartDate . La source update.dat contient des enregistrements avec les valeurs de champ suivantes :
ProductCode | Coût | Date de début |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101.75 | 20120701 |
S022 | 101.75 | 20120701 |
Dans IRI Workbench, il existe un assistant Voracity pour aider à la création de scripts pour la mise à jour des fichiers et tables Dimensional. Cet assistant est situé dans la liste déroulante Voracité de la barre de navigation. Vous choisissez d'abord le type de SCD. Ensuite, la fenêtre de sélection des sources utilisées pour le traitement de la mise à jour s'affiche. Pour le type 2, la cible est normalement le fichier maître ou la table d'origine.
Avec l'écran suivant, vous déterminez comment les données de mise à jour sont mappées et comment les autres valeurs de champ ou de colonne sont définies. Le coût de la mise à jour mappera sur le Master2.cost et la mise à jour. Date de début mappera sur master2.StartDate . Le champ du drapeau est le champ utilisé pour déterminer l'enregistrement avec le coût actif. Autrement dit, si les valeurs de l'enregistrement sont actives ou historiques. Dans ce cas, le champ de drapeau est le champ Actuel . La valeur positive de l'indicateur est la valeur dans Actuel qui détermine si le Coût est le Coût actuel; la valeur est "Y" dans notre exemple et la valeur Flag Negative Value est "N". Le champ de fin contient le nom du champ contenant la valeur utilisée pour déterminer quand le coût de l'enregistrement n'est plus effectif et Master.EndDate détient cette valeur. Valeur finale est utilisé comme valeur pour Champ de fin lorsque l'enregistrement contient les valeurs actuelles d'un ProductCode .
L'écran suivant permet de définir la jointure effectuée avec les sources maître et mise à jour. Vous devez noter que les deux sources doivent être commandées par rapport à ProductCode . Si ce n'est pas le cas, vous devez sélectionner NOT_SORTED dans le menu déroulant pour Option de commande de tri sous la source de données qui doit être triée.
Voici le script de travail :
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat /PROCESS=DELIMITED /ALIAS=master2 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/update.dat /PROCESS=DELIMITED /ALIAS=update /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /JOIN FULL_OUTER master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master2.dat # Include only records that are being updated # Use the Cost and StartDate from the Update file /PROCESS=DELIMITED /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y" /OUTFILE=master2.dat # Change any current records that are being updated to history records # by giving the EndDate as the StartDate from the update record # and changing the field Current to N /PROCESS=DELIMITED /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y")) /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE) /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT) /OMIT WHERE MASTER2.PRODUCTCODE EQ "" /OUTFILE=master2.dat # Add new records /PROCESS=DELIMITED /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""
Le nouveau fichier maître aura ces valeurs :
ProductCode | Coût | Date de début | Date de fin | Actuel |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Oui |
F112 | 2425.00 | 20120701 | 99991231 | Oui |
F112 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 20110930 | 99991231 | Oui |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 550,50 | 20120701 | 99991231 | Oui |
J245 | 450.50 | 20110430 | 20120701 | N |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
M447 | 101.75 | 20120701 | 99991231 | Oui |
S022 | 101.75 | 20120701 | 99991231 | Oui |
S022 | 98,75 | 20110515 | 20120701 | N |