ZAMAN BOYUTLARI OLUŞTURMA – ORACLE (time dimension table)

Merhabalar, iş zekası ve veri ambarı projeleri ile uğraşıyorsanız zaman boyutuna muhakkak ihtiyacınız olacaktır. Çalıştığınız projelerde zaman boyutları farklı detaylarda olabilir. Raporlarınızı yıl, çeyrek, ay, gün detaylarında hazırlamış olabilirsiniz. Her aggregation düzeyine yönelik olarak zaman boyutlarınızı oluşturmanız gerekmektedir.  Örneğin fact tablonuz yıllık düzeyde ise buna karşılık olan zaman boyutunuz yıl detayında olmalıdır; eğer ay detayında ise zaman boyutunuz ay detayında olmalıdır. Bu yazıda sizlere zaman boyutu tabloları oluşturmak için örnek scriptler paylaşmak istiyorum.

SqlServer için script..

Not: Script yayınlanırken tektırnaklar bozulduğundan pdf olarak buraya eklenmiştir.

Gün Detayında Zaman Boyutu oluşturma scripti:

Bu script ile belli bir tarih aralığı arasındaki tüm günler için satırlar oluşturacağız. 2001 yılının ilk gününü başlangıç olarak kabul edip bu tarihten 5800 gün sonrasına kadar satırlar elde edeceğiz. Tablomuzda yıl, ay no, ay adi, gün id, tarih, gün adı, yıl gün, hafta, hafta içi hafta sonu gibi kolonlarımız olacaktır.

CREATE TABLE  DIM_ZAMAN_GUN_DETAYI AS
SELECT
TO_NUMBER(TO_CHAR(DDMMYYYY,’YYYYMMDD’)) ID,
DDMMYYYY,
TO_CHAR(DDMMYYYY,’DD.MM.YYYY’) “DD.MM.YYYY”,
TO_CHAR(DDMMYYYY,’DD-MM-YYYY’) “DD-MM-YYYY”,
EXTRACT(YEAR FROM DDMMYYYY) YIL,
EXTRACT(MONTH FROM DDMMYYYY) AY_NO,
CASE
WHEN EXTRACT(MONTH FROM DDMMYYYY) =1 THEN ‘OCAK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =2 THEN ‘SUBAT’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =3 THEN ‘MART’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =4 THEN ‘NISAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =5 THEN ‘MAYIS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =6 THEN ‘HAZIRAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =7 THEN ‘TEMMUZ’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =8 THEN ‘AGUSTOS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =9 THEN ‘EYLÜL’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =10 THEN ‘EKIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =11 THEN ‘KASIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =12 THEN ‘ARALIK’
END AY_ADI,
TO_NUMBER(TO_CHAR(DDMMYYYY,’WW’)) YIL_HAFTA,TO_NUMBER(TO_CHAR(DDMMYYYY,’DDD’)) YIL_GUN,
TO_NUMBER(TO_CHAR(DDMMYYYY,’D’)) HAFTA_GUN,TO_NUMBER(TO_CHAR(DDMMYYYY,’DD’)) AY_GUN,
CASE WHEN TO_CHAR(DDMMYYYY,’DY’)=’PZT’ THEN ‘PAZARTESI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’SAL’ THEN ‘SALI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’ÇAR’ THEN ‘ÇARSAMBA’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’PER’ THEN ‘PERSEMBE’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’CUM’ THEN ‘CUMA’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’CMT’ THEN ‘CUMARTESI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’PAZ’ THEN ‘PAZAR’
END HAFTA_GUN_AD ,
CASE WHEN TO_CHAR(DDMMYYYY,’DY’)=’PZT’ THEN ‘HI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’SAL’ THEN ‘HI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’ÇAR’ THEN ‘HI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’PER’ THEN ‘HI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’CUM’ THEN ‘HI’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’CMT’ THEN ‘HS’
WHEN TO_CHAR(DDMMYYYY,’DY’)=’PAZ’ THEN ‘HS’
END HAFTA_ICI_SONU
FROM
(SELECT
TO_DATE(‘01012001′,’dD.MM.YYYY’) -1+ LEVEL AS DDMMYYYY
FROM DUAL
CONNECT BY LEVEL <= 5800
);

Ay Detayında Zaman Boyutu oluşturma scripti:

Bu tablomuzda yıl, ay no, ay adi, ay id gibi kolonlarımız olacaktır.

CREATE TABLE  DIM_ZAMAN_AY_DETAYI AS
SELECT
TO_NUMBER(TO_CHAR(DDMMYYYY,’YYYYMM’)) ID,
EXTRACT(YEAR FROM DDMMYYYY) YIL,
EXTRACT(MONTH FROM DDMMYYYY) AY_NO,
CASE
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (1,2,3) THEN ‘1.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (4,5,6) THEN ‘2.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (7,8,9) THEN ‘3.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (10,11,12) THEN ‘4.ÇEYREK’
END CEYREK,
CASE
WHEN EXTRACT(MONTH FROM DDMMYYYY) =1 THEN ‘OCAK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =2 THEN ‘SUBAT’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =3 THEN ‘MART’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =4 THEN ‘NISAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =5 THEN ‘MAYIS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =6 THEN ‘HAZIRAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =7 THEN ‘TEMMUZ’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =8 THEN ‘AGUSTOS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =9 THEN ‘EYLÜL’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =10 THEN ‘EKIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =11 THEN ‘KASIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =12 THEN ‘ARALIK’
END AY_ADI
FROM
(SELECT
TO_DATE(‘01012001′,’dD.MM.YYYY’) -1+ LEVEL AS DDMMYYYY
FROM DUAL
CONNECT BY LEVEL <= 5800
)
GROUP BY
TO_NUMBER(TO_CHAR(DDMMYYYY,’YYYYMM’)),
EXTRACT(YEAR FROM DDMMYYYY),
EXTRACT(MONTH FROM DDMMYYYY),
CASE
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (1,2,3) THEN ‘1.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (4,5,6) THEN ‘2.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (7,8,9) THEN ‘3.ÇEYREK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) IN (10,11,12) THEN ‘4.ÇEYREK’
END,
CASE
WHEN EXTRACT(MONTH FROM DDMMYYYY) =1 THEN ‘OCAK’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =2 THEN ‘SUBAT’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =3 THEN ‘MART’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =4 THEN ‘NISAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =5 THEN ‘MAYIS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =6 THEN ‘HAZIRAN’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =7 THEN ‘TEMMUZ’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =8 THEN ‘AGUSTOS’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =9 THEN ‘EYLÜL’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =10 THEN ‘EKIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =11 THEN ‘KASIM’
WHEN EXTRACT(MONTH FROM DDMMYYYY) =12 THEN ‘ARALIK’
END
ORDER BY 1 ;

Yıl Detayında Zaman Boyutu oluşturma scripti:

Yıl boyutunu manuel olarak da oluşturabiliriz 🙂 fakat connect by level kullanımının yararlarını görmek açısından faydalı olabileceğini düşünüyorum.

CREATE TABLE  DIM_ZAMAN_YIL_DETAYI AS
SELECT
YYYY YIL
FROM
(SELECT
2000 + LEVEL AS YYYY
FROM DUAL
CONNECT BY LEVEL <= 16
)
ORDER BY 1 ;

Umarım yararlı bir yazı olmuştur 🙂

SqlServer için script..

Reklamlar
Bu yazı Data Warehouse, Pure SQL / PLSQL, Raporlama, sql, Veri Ambarı, Veri Tabanı, İş Zekası içinde yayınlandı ve , , , , , , , , , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin.

2 Responses to ZAMAN BOYUTLARI OLUŞTURMA – ORACLE (time dimension table)

  1. Ercüment UMRUK dedi ki:

    Hocam teşekkürler elinize sağlık, birde materialized view ile normal view arasındaki farkları anlatan bir makale yazsanız sevinirim.

    • ozanyayOzan Yay dedi ki:

      Ercüment Hocam yanlış kişiye söylemişsiniz, siz de biliyorsunuz ki bu konuda uzman olan benim:) MV ile V arasındaki ilişkiyi benden daha iyi anlatacak birisini mi arıyorsunuz yoksa?

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s