Ana içeriğe geç
Kesit SQL
Orta · Veri Mühendisliği

Boyut yüklemesi: vekil anahtar eşleme, geç gelen boyut, SCD 2 kapat-aç

Fact satırını doğru boyut sürümüne bağlamak, boyutta olmayan şubeyi kaybetmemek, değişen boyutu kapatıp yeniden açmak.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Fact iş anahtarıyla değil, vekil anahtarla bağlanır

Kaynak S01 diyor. Fact ise sube_key tutar, çünkü aynı şubenin birden çok sürümü olabilir. Bu derste S01 Haziran sonuna kadar Ankara'da, Temmuzdan beri Bursa'da. Mart hareketi Ankara sürümüne, Kasım hareketi Bursa sürümüne bağlanmalı.

Veri kurguduretl_ tabloları hayali bir gece yüklemesi için elle kuruldu. Gerçek bir sistemden alınmadı; bozuk satırlar bilerek kondu.
ÖnkoşulSCD türleri için Yavaş değişen boyutlar dersine bak. Orada geçmiş LEAD ile okunuyor; burada yükleme yazıyoruz.
SELECT h.kaynak_no, h.sube_kodu, h.islem_tarihi, d.sube_key, d.sehir
FROM etl_stg_hareket h
JOIN etl_dim_sube d ON d.sube_kodu = h.sube_kodu
 AND TRY_CONVERT(DATE, h.islem_tarihi) BETWEEN d.gecerli_bas AND d.gecerli_bit
WHERE h.sube_kodu = 'S01'
ORDER BY h.stg_id;
Sık hataguncel = 1 ile eşlemek bütün geçmiş hareketleri bugünkü sürüme yazar. Rapor "Mart'ta Bursa'da hareket" gösterir ve kimse fark etmez, çünkü toplam tutar değişmez.

Boyutta olmayan şube: geç gelen boyut

Hareket gelmiş ama şube S99 henüz boyutta yok. JOIN bu satırı sessizce atar, toplam eksik çıkar. İki yaygın çözüm:

YolNasılBedel
Bilinmeyen üyeLEFT JOIN, eşleşmezse -1Sonra şube gelince fact güncellemesi gerekir
Tahmini üye (inferred)Boyuta iskelet satır ekle, gerçek veri gelince tamamlaBoyutta eksik alanlı satır olur

SCD 2: önce kapat, sonra aç

Sıra önemli. Önce değişen güncel satır kapatılır, sonra güncel sürümü kalmayan her şube için yeni satır açılır. Böylece hem değişen hem tamamen yeni şube aynı INSERT ile açılır.

UPDATE d SET d.gecerli_bit = '2024-11-11', d.guncel = 0
FROM etl_dim_sube d
JOIN etl_stg_sube s ON s.sube_kodu = d.sube_kodu
WHERE d.guncel = 1 AND (s.sube_adi <> d.sube_adi OR s.sehir <> d.sehir);
INSERT INTO etl_dim_sube (sube_kodu, sube_adi, sehir, gecerli_bas, gecerli_bit, guncel)
SELECT s.sube_kodu, s.sube_adi, s.sehir, '2024-11-12', '9999-12-31', 1
FROM etl_stg_sube s
LEFT JOIN etl_dim_sube d ON d.sube_kodu = s.sube_kodu AND d.guncel = 1
WHERE d.sube_key IS NULL;
SELECT sube_key, sube_kodu, sehir, gecerli_bas, gecerli_bit, guncel FROM etl_dim_sube ORDER BY sube_kodu, gecerli_bas;
NULL tuzağıs.sehir <> d.sehir, alanlardan biri NULL ise doğru dönmez ve değişiklik kaçar. Gerçek yüklemede NULL olabilen sütunları ayrıca karşılaştır.

Sıralama

Boyutlar önce, fact sonra yüklenir. Tersi olursa yeni gelen şube fact yüklemesinde bilinmeyen sayılır.

Alıştırmalara geç (8)