ODI da SCD örneği
SCD nedir, linkteki tanımlamanın benzerini yapacağım için alıntılıyorum;
Kaynak: Kurumsal Zeka
Esnek olduğu ve geçmiş bilgileri tuttuğu için SCD type 2 en çok tercih edilen yapı oluyor. Bunun ile ilgili ODI’de type 2 SCD oluşturulmasından ve geliştirip yapabileceklerimize biraz bakalım.
Oracle db örnek şemalarını yüklediğimizde gelen sh user ı altında bulunan channels tablosunu örnek olarak aldım;
CREATE TABLE CHANNELS
(
CHANNEL_ID NUMBER NOT NULL,
CHANNEL_DESC VARCHAR2(20 BYTE) NOT NULL,
CHANNEL_CLASS VARCHAR2(20 BYTE) NOT NULL,
CHANNEL_CLASS_ID NUMBER NOT NULL,
CHANNEL_TOTAL VARCHAR2(13 BYTE) NOT NULL,
CHANNEL_TOTAL_ID NUMBER NOT NULL
);
INSERT INTO SH.CHANNELS ( CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_CLASS_ID, CHANNEL_TOTAL,
CHANNEL_TOTAL_ID ) VALUES (
3, ‘Direct Sales’, ‘Direct’, 12, ‘Channel total’, 1);
INSERT INTO SH.CHANNELS ( CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_CLASS_ID, CHANNEL_TOTAL,
CHANNEL_TOTAL_ID ) VALUES (
9, ‘Tele Sales’, ‘Direct’, 12, ‘Channel total’, 1);
INSERT INTO SH.CHANNELS ( CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_CLASS_ID, CHANNEL_TOTAL,
CHANNEL_TOTAL_ID ) VALUES (
5, ‘Catalog’, ‘Indirect’, 13, ‘Channel total’, 1);
INSERT INTO SH.CHANNELS ( CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_CLASS_ID, CHANNEL_TOTAL,
CHANNEL_TOTAL_ID ) VALUES (
4, ‘Internet’, ‘Indirect’, 13, ‘Channel total’, 1);
INSERT INTO SH.CHANNELS ( CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_CLASS_ID, CHANNEL_TOTAL,
CHANNEL_TOTAL_ID ) VALUES (
2, ‘Partners’, ‘Others’, 14, ‘Channel total’, 1);
COMMIT;
SCD tablosu olacak channels_hist tablosunu oluşturdum;
CREATE TABLE CHANNELS_HIST
(
CHANNEL_ID NUMBER NOT NULL,
CHANNEL_DESC VARCHAR2(20 BYTE) NOT NULL,
CHANNEL_CLASS VARCHAR2(20 BYTE) NOT NULL,
CHANNEL_CLASS_ID NUMBER NOT NULL,
CHANNEL_TOTAL VARCHAR2(13 BYTE) NOT NULL,
CHANNEL_TOTAL_ID NUMBER NOT NULL,
ETL_START_DATE DATE,
ETL_END_DATE DATE,
CURRENT_FLAG NUMBER
);
Model yan penceresinde Channel_hist modelinin columns kısmını açıp channel_id yi seçiyorum, description alanında Slowly Changing Behavior:Natural Key seçiyorum.
CHANNEL_DESC CHANNEL_CLASS CHANNEL_CLASS_ID CHANNEL_TOTAL CHANNEL_TOTAL_ID alanları için Slowly Changing Behavior: Add row on change seçiyorum.
ETL_START_DATE alanı Slowly Changing Behavior: Starting timestamp,
ETL_END_DATE Slowly Changing Behavior: Ending timestamp,
CURRENT_FLAG Slowly Changing Behavior: Current record flag olarak değiştiriyorum.
INT_CHANNELS_HIST interface inde flow kısmında IKM Slowly Changing Dimension seçilir.
Interface execute edildiğinde etl_end_date alanında mapping de to_date(’29990101′, ‘YYYYMMDD’) yazdığım halde KM içinde kodlandığı için 01/01/2400 basılıyor.
Channels_hist tablosunun ilk durumu şu şekilde oluyor;
select * from CHANNELS_HIST
CHANNEL_ID CHANNEL_DESC CHANNEL_CLASS CHANNEL_CLASS_ID CHANNEL_TOTAL
CHANNEL_TOTAL_ID ETL_START_DATE ETL_END_DATE CURRENT_FLAG
3 Direct Sales Direct 12 Channel total 1 18.10.2011 21:53:17 1
9 Tele Sales Direct 12 Channel total 1 18.10.2011 21:53:17 1
5 Catalog Indirect 13 Channel total 1 18.10.2011 21:53:17 1
4 Internet Indirect 13 Channel total 1 18.10.2011 21:53:17 1
2 Partners Others 14 Channel total 1 18.10.2011 21:53:17 1
Bazı alanlarda datada değişiklik yapıyorum;
UPDATE CHANNELS
SET CHANNEL_DESC=’Telephone’
where channel_id=9;
UPDATE CHANNELS
SET CHANNEL_DESC=’Direct’
where channel_id=3;
commit;
Interface i tekrar çalıştırdığımızda yeni datayı tutan 2 yeni kayıt elde etmiş oluyoruz, eski kayıtlar current_flag=0 olarak işaretleniyor, ETL_END_DATE=18.10.2011 23:32:07 olarak değiştirildi ve yeni kayıtlarda data değişmiş olarak görüyoruz:
CHANNEL_ID CHANNEL_DESC CHANNEL_CLASS CHANNEL_CLASS_ID CHANNEL_TOTAL CHANNEL_TOTAL_ID ETL_START_DATE ETL_END_DATE CURRENT_FLAG
–Eski kayıtlar
3 Direct SalesDirect 12 Channel total 1 18.10.2011 23:11:30 18.10.2011 23:32:07 0
9 Tele Sales Direct 12 Channel total 1 18.10.2011 23:11:30 18.10.2011 23:32:07 0
–Yeni kayıtlar
3 Direct Direct 12 Channel total 1 18.10.2011 23:32:07 01.01.2400 1
9 Telephone Direct 12 Channel total 1 18.10.2011 23:32:07 01.01.2400 1