Data dimensi yang berubah secara perlahan atau tidak terduga ditangkap dalam analisis Dimensi yang Berubah Perlahan (SCD). Dalam lingkungan data warehouse, tabel dimensi memiliki kunci utama yang secara unik mengidentifikasi setiap record dan bagian informasi lainnya yang dikenal sebagai data dimensional.
Semua metode pembaruan untuk jenis SCD yang berbeda dapat dilakukan dengan menggunakan program SortCL di IRI CoSort. Di IRI Voracity ada wizard untuk membantu membuat skrip pekerjaan SCD yang digunakan saat menjalankan program SortCL. Sebagian besar variasi menggunakan gabungan luar penuh untuk mencocokkan catatan dari sumber data asli dengan catatan di sumber yang diperbarui berdasarkan menyamakan kunci dari masing-masing. Catatan di sumber pembaruan yang tidak memiliki kecocokan perlu ditambahkan ke master.
Berikut adalah ikhtisar tentang cara memperbarui file atau tabel dimensi menggunakan SCD Tipe 6 di mana saya mempertahankan biaya produk. Pembaruan dilakukan dengan bergabung sehubungan dengan bidang ProductCode .
Ketik 6 SCD
Tipe 6 merupakan hibrida yang merupakan gabungan dari Tipe 1, Tipe 2, dan Tipe 3. Disebut Tipe 6 karena 1+2+3=6. Setiap catatan akan memiliki bidang berikut:
- Kode Produk : Ini adalah kolom kunci pengenal.
- Biaya :Biaya produk saat ini.
- Biaya Historis :Biaya yang mulai berlaku pada Tanggal Mulai untuk catatan tersebut.
- Tanggal Mulai :Tanggal mulainya HistoricalCost.
- Tanggal Akhir :Tanggal saat HistoricalCost untuk dicatat tidak lagi menjadi CurrentCost saat ini. Jika Biaya Historis masih merupakan Biaya saat ini, maka Tanggal Berakhir adalah 99991231.
- Saat ini :Y jika Biaya masih berlaku, N jika tidak
Untuk saat ini mari kita lihat catatan untuk ProductCode J245. Mari kita mulai kapan Biaya Historis paling awal adalah Biaya saat ini. Biaya Historis sama dengan Biaya. Kemudian ada satu record untuk ProductCode J245 dan memiliki nilai yang ditunjukkan di bawah ini:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | Y |
Saat Biaya baru perlu diterapkan, nilai dalam catatan pembaruan digunakan untuk menambahkan catatan baru saat ini. Biaya Saat Ini di semua catatan dengan Kode Produk J245 akan diubah menjadi Biaya nilai dari catatan pembaruan saat Biaya Historis tetap sama untuk catatan yang ada. Selain itu, Tanggal Akhir untuk record lama saat ini diubah menjadi StartDate untuk rekor baru saat ini. Dalam catatan dengan ProductCode J245, Biaya Saat Ini bidang dalam file Master yang diperbarui sekarang memiliki nilai di bawah ini:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | Y |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | T |
Sekarang kami akan memperbarui dengan biaya baru berikutnya dan mendapatkan nilai berikut untuk catatan J245:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | T |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | T |
Pembaruan terakhir membuat catatan yang memiliki nilai berikut:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Y |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | T |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | T |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | T |
Berikut adalah nilai dalam file master sebelum memperbarui:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
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 | T |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | T |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | T |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | Y |
Semua data pembaruan akan memiliki Tanggal Mulai yang sama . Sumber update.dat berisi nilai berikut:
Kode Produk | Biaya | Tanggal Mulai |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101.75 | 20120701 |
S022 | 101.75 | 20120701 |
Di IRI Workbench, ada wizard Voracity untuk membantu pembuatan skrip untuk memperbarui file dan tabel Dimensi. Wizard ini terletak di dropdown Voracity di bilah navigasi. Pertama Anda memilih jenis SCD. Kemudian jendela tempat Anda memilih sumber yang digunakan untuk memproses pembaruan akan ditampilkan. Untuk Tipe 6, target biasanya adalah file master atau tabel asli.
Dengan layar berikutnya, Anda menentukan bagaimana data pembaruan dipetakan dan bagaimana nilai bidang atau kolom lainnya ditetapkan. Pembaruan.Biaya bidang akan dipetakan ke master6.CurrentCost dan update.StartDate bidang akan dipetakan ke master6.StartDate . Bidang Bendera adalah bidang yang digunakan untuk menentukan apakah catatan berisi nilai bidang terbaru. Dalam hal ini bidang tersebut adalah master6.current . Jika ini adalah rekor terbaru, maka CurrentCost bidang dan Biaya Riwayat bidang akan memiliki nilai yang sama. Tandai Nilai Positif adalah nilai dalam master6.Current yang menentukan bahwa nilai bidang adalah nilai terbaru untuk ProductCode . Jika demikian, nilainya adalah “Y” dalam contoh kita dan Nilai Negatif Tandai adalah n". Bidang Akhir berisi nama bidang yang menyimpan nilai yang digunakan untuk menentukan kapan Biaya untuk catatan tidak lagi efektif dan Master.EndDate memegang nilai itu. Nilai Akhir digunakan sebagai nilai untuk Bidang Akhir saat rekor terkini.
Layar berikutnya adalah untuk menentukan gabungan yang dilakukan dengan master dan memperbarui sumber. Anda harus memperhatikan bahwa kedua sumber harus diurutkan sesuai dengan ProductCode . Jika tidak, maka Anda harus memilih NOT_SORTED di tarik-turun untuk Opsi Urutan Urutkan di bawah sumber data yang perlu diurutkan.
Berikut adalah skrip pekerjaan pertama:
/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
Untuk meninjau,
- Nilai untuk CurrentCost akan sama untuk semua record yang memiliki ProductCode common yang sama
- Tanggal Mulai adalah tanggal Biaya Historis menjadi efektif
- Untuk catatan terbaru dari ProductCode,
- nilai untuk CurrentCost dan Biaya Historis sama
- Tanggal Akhir adalah 99991231
- Nilai dalam Saat Ini adalah Y
- Untuk catatan yang bukan catatan saat ini
- Tanggal Akhir adalah tanggal saat Biaya yang lebih baru berikutnya menjadi efektif
- Bidang Saat ini memiliki N untuk nilai
File master baru tidak akan diurutkan karena catatan master baru saat ini ditambahkan ke bagian bawah file master yang akan memiliki nilai seperti ini:
Kode Produk | Biaya | Biaya Historis | Tanggal Mulai | Tanggal Akhir | Saat ini |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2425.00 | 2365.00 | 20120101 | 20120701 | T |
G101 | 19,25 | 19.25 | 20110930 | 99991231 | Y |
G101 | 19,25 | 21,25 | 20110501 | 20110930 | T |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | T |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | T |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | T |
S022 | 101.75 | 98,75 | 20110515 | 20120701 | T |
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 |