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 éléments d'information appelés 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 variantes 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 mise à jour en fonction de l'équivalence d'une clé de chacun. 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 ou un tableau dimensionnel à l'aide de SCD Type 6 où je maintiens les coûts des produits. La mise à jour s'effectue en joignant par rapport au champ ProductCode .
SCD de type 6
Le type 6 est un hybride qui est une combinaison de type 1, type 2 et type 3. Il est appelé type 6 car 1 + 2 + 3 =6. Chaque enregistrement aura les champs suivants :
- Code produit : Il s'agit du champ de la clé d'identification.
- Coût :coût actuel du produit.
- Coût historique :Coût qui est devenu effectif à la date de début pour cet enregistrement.
- Date de début :Date à laquelle le coût historique est devenu effectif.
- Date de fin :date à laquelle le coût historique de l'enregistrement n'était plus le coût actuel actuel. Si le coût historique est toujours le coût actuel, alors la date de fin est 99991231.
- En cours :Y si Cost est toujours d'actualité, N si ce n'est pas le cas
Pour l'instant, regardons simplement les enregistrements pour ProductCode J245. Commençons par le premier HistoricalCost était le coût actuel. Le coût historique est le même que le coût. Il y a alors un enregistrement pour le ProductCode J245 et il a les valeurs indiquées ci-dessous :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
J245 | 385.25 | 385.25 | 20100215 | 99991231 | Oui |
Lorsqu'un nouveau coût doit être mis en œuvre, les valeurs de l'enregistrement de mise à jour sont utilisées pour ajouter un nouvel enregistrement actuel. Le coût actuel dans tous les enregistrements avec le code produit J245 sera remplacé par le coût valeur de l'enregistrement de mise à jour tandis que le HistoricalCost reste le même pour les enregistrements existants. De plus, la EndDate pour l'ancien enregistrement actuel est remplacé par StartDate pour le nouveau record actuel. Dans les enregistrements avec ProductCode J245, le coût actuel champ dans le fichier maître mis à jour a maintenant les valeurs ci-dessous :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
J245 | 425.25 | 425.25 | 20101001 | 99991231 | Oui |
J245 | 425.25 | 385.25 | 20100215 | 20101001 | N |
Nous allons maintenant mettre à jour avec le prochain nouveau coût et obtenir les valeurs suivantes pour les enregistrements J245 :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
J245 | 450.50 | 450,50 | 20110430 | 99991231 | Oui |
J245 | 450.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450.50 | 385.25 | 20100215 | 20101001 | N |
La mise à jour finale crée des enregistrements qui ont ces valeurs :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Oui |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385.25 | 20100215 | 20101001 | N |
Voici les valeurs dans le fichier maître avant la mise à jour :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Oui |
F112 | 2365.00 | 2365.00 | 20120101 | 99991231 | Oui |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | Oui |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 450.50 | 450,50 | 20110430 | 99991231 | Oui |
J245 | 450.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450.50 | 385.25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | Oui |
Les données de mise à jour auront toutes la même StartDate . La source update.dat contient les valeurs 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 se trouve 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 6, 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 le champ correspondra à master6.CurrentCost et le update.StartDate le champ correspondra à master6.StartDate . Le champ du drapeau est le champ utilisé pour déterminer si l'enregistrement contient les valeurs de champ les plus récentes. Dans ce cas, ce champ est master6.current . S'il s'agit de l'enregistrement le plus récent, alors le CurrentCost champ et le HistoryCost champ aura les mêmes valeurs. La valeur positive de l'indicateur est la valeur dans master6.Current qui détermine que les valeurs des champs sont les valeurs les plus récentes pour un ProductCode . Lorsque c'est le cas, la valeur est "Y" dans notre exemple et la valeur Flag Negative Value est "N". Fin du champ 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 est en cours.
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 la liste déroulante pour Option de tri de l'ordre sous la source de données qui doit être triée.
Voici le premier script de travail :
/INFILE=master6.dat /PROCESS=DELIMITED /ALIAS=master6 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INFILE=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 NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Make changes to records that have the same ProductCode # as records in the update file /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE) /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Keep the records that have no updates /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER6.PRODUCTCODE EQ "" /OUTFILE=master6.dat # Add the records with new product codes /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE UPDATE.PRODUCTCODE EQ "" /INCLUDE WHERE UPDATE.PRODUCTCODE
Pour réviser,
- La valeur de CurrentCost sera le même pour tous les enregistrements qui ont un ProductCode commun
- Date de début est la date à laquelle le HistoricalCost est devenu effectif
- Pour l'enregistrement le plus récent d'un ProductCode,
- les valeurs de CurrentCost et Coût historique sont les mêmes
- la date de fin est 99991231
- La valeur dans Actuel est Y
- Pour les enregistrements qui ne sont pas l'enregistrement actuel
- Date de fin est la date à laquelle le prochain coût plus récent est devenu effectif
- Le champ Actuel a N pour la valeur
Le nouveau fichier maître ne sera pas trié car les nouveaux enregistrements maîtres actuels ont été ajoutés au bas du fichier maître qui aura des valeurs comme ceci :
ProductCode | Coût | Coût historique | Date de début | Date de fin | Actuel |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Oui |
F112 | 2425.00 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | Oui |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385.25 | 20100215 | 20101001 | N |
S022 | 101.75 | 98,75 | 20110515 | 20120701 | N |
F112 | 2425.00 | 2425.00 | 20120701 | 99991231 | Oui |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Oui |
M447 | 139.25 | 139.25 | 20120701 | 99991231 | Oui |
S022 | 101.75 | 101.75 | 20120701 | 99991231 | Oui |