sql >> Databasteknik >  >> RDS >> Database

SCD typ 3

Dimensionsdata som förändras långsamt eller oförutsägbart fångas i Slowly Changing Dimensions (SCD) analyser. I en datalagermiljö har en dimensionstabell en primärnyckel som unikt identifierar varje post och annan information som kallas dimensionsdata.

Alla uppdateringsmetoder för de olika SCD-typerna kan utföras med programmet SortCL i IRI CoSort. I IRI Voracity finns det en guide som hjälper dig att skapa SCD-jobbskripten som används när du kör SortCL-programmet. De flesta varianter använder en fullständig yttre koppling för att matcha poster från den ursprungliga huvuddatakällan med poster i den uppdaterade källan baserat på att likställa en nyckel från varje. Poster med matchningar måste uppdateras i mastern. Poster i uppdateringskällan som inte har en matchning måste läggas till i mastern.

Här är en översikt över hur man uppdaterar en dimensionsfil med SCD Type 3 där jag underhåller produktkostnaderna. Uppdateringen görs genom att gå med i fältet Produktkod .

Typ 3 SCD

Med typ 3-modellen lagras aktuella data och historiska data i samma post. En av de viktigaste sakerna att bestämma är hur mycket historia som ska bevaras. Med vårt exempel kommer jag att hålla en kostnad för tre startdatum. Slutdatum är det datum då kostnaden i posten inte längre är effektiv. Om kostnaden fortfarande är effektiv, är Slutdatum1 fältet sätts till 99991231. Detta för att undvika ett tomt värde i detta fält. Här är värdena som finns i starthuvudkällan (master3.dat):

Produktkod Kostnad1 Startdatum1 Slutdatum1 Kostnad2 Startdatum2 Slutdatum2 Kostnad3 Startdatum3 Slutdatum3
C123 125,50 20110228 99991231
F112 2365.00 20120101 99991231
G101 19.25 20110930 99991231 21.25 20110501 20110930
J245 450,50 20110430 99991231 425.25 20101001 20110430 385.25 20100215 20101001
S022 98,75 20110515 99991231

Uppdateringsposterna har alla samma startdatum. Update.dat-källan innehåller följande fältvärden för posterna:

Produktkod Kostnad Startdatum
F112 2425.00 20120701
J245 550.50 20120701
M447 101,75 20120701
S022 101,75 20120701

Nedan finns uppdaterade data. För varje post som uppdaterades flyttas varje kostnad, startdatum och slutdatum åt höger med en uppsättning. I den gamla nuvarande gruppen ändras slutdatumet till startdatumet för den nya uppdaterade nuvarande uppsättningen. Alla värden för den gamla tredje uppsättningen kasseras.

Produktkod Kostnad1 Startdatum1 Slutdatum1 Kostnad2 Startdatum2 Slutdatum2 Kostnad3 Startdatum3 Slutdatum3
C123 125,50 20110228 9991231
F112 2425.00 20120701 9991231 2365.00 20120101 20120701
G101 19.25 20110930 9991231 21.25 20110501 20110930
J245 550.50 20120701 9991231 450,50 20110430 20120701 425.25 20101001 20110430
M447 101,75 20120701 9991231
S022 101,75 20120701 9991231 98,75 20110515 20120701

I IRI Workbench finns det en Voracity-guide som hjälper dig att skapa skript för uppdatering av dimensionsfiler och tabeller. Den här guiden finns i rullgardinsmenyn Voracity i navigeringsfältet. Först väljer du SCD-typen. Då visas fönstret där du väljer de filer som används för att bearbeta uppdateringen.

I den översta tabellen på nästa skärm bestämmer du hur data som uppdateras mappas till mastern. I mittgrupperingen på skärmen väljer du fälten som ger statusvärdena för de poster som uppdateras.

I rullgardinsmenyn under Aktuell och Historiska fältuppsättningar , den första uppsättningen som du definierar, ger fältnamnen för aktuella värden. Värdefält är det dimensionella värdet som uppdateras. Startfält är fältet som avgör när Värdefältet blev aktiv och Avsluta fält avgör när den inte längre är giltig. Definiera sedan så många uppsättningar som du behöver för antalet historiska värden som sparas.

Här är jobbskriptet som kommer att uppdatera huvudfilen:

/INFILE=master3.dat
    /PROCESS=DELIMITED
    /ALIAS=master3
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/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 master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are to be updated
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are not to be updated
    /PROCESS=DELIMITED
    /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER3.PRODUCTCODE EQ ""
/OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat
# Add new records
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""

  1. Lagra bild till databas blob; hämta från db till Picturebox

  2. (engelska) Hur man använder Oracle Database 19c Pre-Built Developer VM

  3. Hur man kontrollerar storleken på en databas i MySQL

  4. SQL Server strängfunktioner (fullständig lista)