sql >> Databasteknik >  >> RDS >> Database

SCD typ 6

Dimensionsdata som förändras långsamt eller oförutsägbart fångas i Slowly Changing Dimensions-analyser (SCD). 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 datakällan med poster i den uppdaterade källan baserat på att likställa en nyckel från varje. 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 dimensionell fil eller tabell med SCD Type 6 där jag underhåller produktkostnaderna. Uppdateringen görs genom att gå med i fältet ProductCode .

Typ 6 SCD

Typ 6 är en hybrid som är en kombination av typ 1, typ 2 och typ 3. Den kallas typ 6 eftersom 1+2+3=6. Varje post kommer att ha följande fält:

  • Produktkod :  Detta är identifieringsnyckelfältet.
  • Kostnad :Nuvarande kostnad för produkten.
  • Historisk kostnad :Kostnad som trädde i kraft på Startdatumet för den posten.
  • Startdatum :Datum då den historiska kostnaden trädde i kraft.
  • Slutdatum :Datum då den historiska kostnaden inte längre var den aktuella CurrentCost. Om den historiska kostnaden fortfarande är den aktuella kostnaden är slutdatumet 99991231.
  • Aktuell :Y om kostnaden fortfarande är aktuell, N om den inte är det

Låt oss nu bara titta på posterna för ProductCode J245. Låt oss börja när den tidigaste HistoricalCost var den nuvarande kostnaden. Den historiska kostnaden är densamma som kostnaden. Det finns sedan en post för ProductCode J245 och den har värdena som visas nedan:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
J245 385.25 385.25 20100215 99991231 Y

När en ny kostnad behöver implementeras används värdena i uppdateringsposten för att lägga till en ny aktuell post. Aktuell kostnad i alla register med produktkoden J245 kommer att ändras till Kostnad värde från uppdateringsposten medan HistoricalCost förblir densamma för de befintliga posterna. Dessutom är Slutdatum för den gamla aktuella posten ändras till Startdatum för det nya nuvarande rekordet. I posterna med ProductCode J245, Current Cost fältet i den uppdaterade huvudfilen har nu följande värden:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
J245 425.25 425.25 20101001 99991231 Y
J245 425.25 385.25 20100215 20101001 N

Nu kommer vi att uppdatera med nästa nya kostnad och få följande värden för J245-posterna:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
J245 450,50 450,50 20110430 99991231 Y
J245 450,50 425.25 20101001 20110430 N
J245 450,50 385.25 20100215 20101001 N

Den sista uppdateringen skapar poster som har dessa värden:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
J245 550.50 550.50 20120701 99991231 Y
J245 550.50 450,50 20110430 20120701 N
J245 550.50 425.25 20101001 20110430 N
J245 550.50 385.25 20100215 20101001 N

Här är värdena i huvudfilen före uppdatering:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
C123 125,50 125,50 20110228 99991231 Y
F112 2365.00 2365.00 20120101 99991231 Y
G101 19.25 19.25 20110930 99991231 Y
G101 19.25 21.25 20110501 20110930 N
J245 450,50 450,50 20110430 99991231 Y
J245 450,50 425.25 20101001 20110430 N
J245 450,50 385.25 20100215 20101001 N
S022 98,75 98,75 20110515 99991231 Y

Alla uppdateringsdata kommer att ha samma Startdatum . Update.dat-källan innehåller följande värden:

Produktkod Kostnad Startdatum
F112 2425.00 20120701
J245 550.50 20120701
M447 101,75 20120701
S022 101,75 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 källor som används för att bearbeta uppdateringen. För typ 6 är målet normalt den ursprungliga huvudfilen eller tabellen.

Med nästa skärm bestämmer du hur uppdateringsdatan mappas och hur andra fält- eller kolumnvärden ställs in. update.Cost fältet mappas till master6.CurrentCost och update.StartDate fältet mappas till master6.StartDate . Flaggafältet är fältet som används för att avgöra om posten innehåller de senaste fältvärdena. I det här fallet är fältet master6.current . Om det är den senaste posten, då CurrentCost och Historikkostnad fältet kommer att ha samma värden. Flagga positivt värde är värdet i master6.Current som bestämmer att fältvärdena är de senaste värdena för en Produktkod . När så är fallet är värdet "Y" i vårt exempel och Flagga negativt värde är "N". Slutfält innehåller namnet på fältet som innehåller värdet som används för att avgöra när kostnaden för posten inte längre är effektiv och Master.EndDate har det värdet. Slutvärde används som värde för Slutfält när posten är aktuell.

Nästa skärm är för att definiera kopplingen som utförs med master- och uppdateringskällorna. Du bör notera att båda källorna måste beställas med avseende på ProductCode . Om de inte är det, måste du välja NOT_SORTED i rullgardinsmenyn för Sorteringsorderalternativ under datakällan som behöver sorteras.

Här är det första jobbskriptet:

/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

För att granska,

  • Värdet för CurrentCost kommer att vara samma för alla poster som har en gemensam Produktkod
  • Startdatum är det datum då Historisk kostnad trädde i kraft
  • För den senaste informationen om en Produktkod,
    • värdena för CurrentCost och Historisk kostnad är desamma
    •  Slutdatumet är 99991231
    • Värdet i Aktuell är Y
  • För de poster som inte är den aktuella posten
    • Slutdatum är det datum då nästa nyare kostnad trädde i kraft
    • Fältet Aktuell har N för värdet

Den nya masterfilen kommer inte att sorteras eftersom de nya aktuella masterposterna har lagts till längst ner i masterfilen som kommer att ha värden som detta:

Produktkod Kostnad Historisk kostnad Startdatum Slutdatum Aktuell
C123 125,50 125,50 20110228 99991231 Y
F112 2425.00 2365.00 20120101 20120701 N
G101 19.25 19.25 20110930 99991231 Y
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 Y
J245 550.50 550.50 20120701 99991231 Y
M447 139,25 139,25 20120701 99991231 Y
S022 101,75 101,75 20120701 99991231 Y

  1. Android SQLite databas och app uppdatering

  2. Använda OAuth för att autentisera din ODBC-anslutning till Salesforce.com

  3. Hur COLLATION() fungerar i MariaDB

  4. WHERE-sats på SQL Server Textdatatyp