LASTNONBLANK, FIRSTNONBLANK

DAXDAX 101

LASTNONBLANK -ve ekürisi olan FIRSTNONBLANK-  isimlerinden de anlaşılacağı üzere mevcut context’teki boş olmayan ilk ve son değeri döndüren iki fonksiyon.

Syntax’ları aşağıdaki gibi:

FIRSTNONBLANK ( 'Tablo Adı'[Sütun Adı]; ifade )
LASTNONBLANK ( 'Tablo Adı'[Sütun Adı] ; ifade )

Fonksiyona verdiğimiz sütun adı, doğrudan bir sütun referansı olabileceği gibi, sonucu tek sütunluk bir tablo olan başka bir tablo fonksiyonu da olabilir.

Sonu X ile biten fonksiyonların (SUMX, AVERAGEX ..) iterator olduğunu biliyoruz, ama X ile bitmeyen iterator fonksiyonlar da var (en çok kullandığımız da FILTER). LASTNONBLANK bir iterator. Verdiğimiz sütun üzerinde row context yaratarak çalışır.

Bir iterator olmasına ek olarak, bu fonksiyonun döndürdüğü şey tek sütunluk ve tek satırlık bir tablodur.

LASTNONBLANK ‘e verdiğimiz sütun genellikle tarih tipindeki sütunlardır.

Örnek modelde Microsoft’un 2019 yılındaki hisse senedi değerlerine ait veriler var. Veriler günlük ama her gün için değer yok (hafta sonlarında bir değer yok).

lastnonblank

LASTNONBLANK bir miktar LASTDATE‘e benziyor -ama değil-, bu yüzden örnekleri LASTDATE (ve daha sonra MAX ile) vereceğim. Zaman zaman aynı sonuçları verseler de aralarında farklar var.

Model basit, tarih tablosuyla hisse senedi değerleri tablosu arasında ilişki var.


Ay bitimindeki en son hisse senedi değerlerini bulmak istiyoruz! İlk metrikleri LASTDATE ile yazıyorum:

LastDate_:= LASTDATE('Tarih'[Tarih] )
Hisse Kapanış_LastDate :=
CALCULATE( SUM( MSFT[Kapanış Değeri] ) ; LASTDATE('Tarih'[Tarih] ) )

LASTDATE’e Tarih tablosundaki Tarih sütununu verdik ve olması gerektiği gibi tarih tablosundaki son tarihi döndürüyor. Hisse kapanış metriği bazı aylar için bir şey döndürüyor bazı aylar içinse döndürmüyor. Ocak için bir şey dönüyor çünkü 31.01.2019 tarihinde bir hisse değeri var veride ama 31.03.2019 tarihinde bir değer yok, dolayısıyla Mart için dönen bir şey yok!

LASTNONBLANK bu gibi durumlarda devreye giriyor. LASTNONBLANK ile Tarih tablosundaki Tarih sütununu kullanarak, hisse değerinin boş olmadığı (blank olmadığı) en son tarihi bulabiliriz.

LastNonBlank_ := 
LASTNONBLANK( 'Tarih'[Tarih] ; CALCULATE( SUM('MSFT'[Kapanış Değeri] )))

Mart için hisse değerinin boş olmadığı en son tarih 29.03.2019 ve 2019 yılının tamamı içinse 8.07.2019 ! LASTNONBLANK, verdiğimiz ifadenin boş olmadığı en son tarihleri buldu. Dolayısıyla artık metriğimizi modifiye edebiliriz!

Hisse Kapanıs_LastNonBlank :=
CALCULATE( SUM( MSFT[Kapanış Değeri] ) ;
  LASTNONBLANK('Tarih'[Tarih] ; CALCULATE( SUM('MSFT'[Kapanış Değeri])))
)

İlgili tarih periyodu için hisse senedi değerinin boş olmadığı en son değerleri doğru bir şekilde bulduk!

Achtung! Attention ! Dikkat! LASTNONBLANK bir iterator, formülde ikinci parametreyi yani SUM (….) kısmını CALCULATE ile çağırdık çünkü context transition‘ın gerçekleşmesini istiyoruz. Fonksiyonun ilk parametresine verdiğimiz sütun ile ikinci parametrede kullandığımız ifade aynı tablo üzerinde işlem yapıyor olsaydı buna gerek kalmazdı. Farklı tablolarda bulunan/çalışan ifade ve sütun olduğundan doğru çalışması için context transition’ın gerçekleşmesine ihtiyacımız var. CALCULATE yerine duruma göre RELATEDTABLE  veya CALCULATETABLE ‘da kullanabiliriz, yeter ki context transition gerçekleşsin!

Context transition olmazsa yanlış sonuçlar alırız çünkü:

LastNonBlank_Yanlış := 
LASTNONBLANK( 'Tarih'[Tarih] ; SUM( 'MSFT'[Kapanış Değeri] ) )
Hisse Kapanıs_LastNonBlank_Yanlış :=
CALCULATE( SUM( MSFT[Kapanış Değeri] ) ;
    LASTNONBLANK( 'Tarih'[Tarih] ; SUM( 'MSFT'[Kapanış Değeri] ) )
)

** Ara not : İkinci parametrede verdiğimiz ifade doğrudan bir metrik olsaydı başına CALCULATE yazmasak da olurdu, çünkü DAX bir metrik çağırdığımızda biz yazsak da yazmasak da başında CALCULATE varmış gibi çalıştırır.

Eğer verinizde istisnasız tüm tarihler için bir değer bulunduğundan eminseniz bu tarihlerdeki son (veya ilk) değerleri bulmak için FIRSTDATE/LASTDATE ‘i sorunsuz kullanabilirsiniz. Ama yukarıdaki gibi bir durum varsa FIRSTNONBLANK/LASTNONBLANK fonksiyonlarını kullanmanız gerekir.

Sıklıkla lazım olan durumları örneklendirmek gerekirse, maliyet bilgisinin olduğu dolayısıyla karlılık hesabının yapıldığı modellerde genelde lazım oluyor. İçinde bulunduğumuz ayın maliyetleri henüz oluşmadığından en son maliyete göre hesap yapmak istiyoruz. Ya da en son kesilen faturadan sonra kaç gün geçti, en son hangi tarihte stok hareketi gördü, müşteri en son ne zaman geldi gibi metriklerde de lazım olabiliyor.

LASTNONBLANK genellikle tarih tipindeki sütunlarla kullanılır demiştim ama başka tipteki sütunlarla da kullanılabilir. Tarih sütunlarının kendi doğal sıralama mantığı var. İlk tarihten son tarihe -veya tersi- gidiyor. Fonksiyona verdiğimiz sütun eğer text tipindeyse A-Z  veya Z-A sıralaması geçerli. Sütun nümerik ise küçükten büyüğe büyükten küçüğe sıralaması geçerli. Eğer verdiğimiz sütunu Sort by Column ile başka bir sütuna göre sıralıyorsak bunu da kaale almıyor!

LASTDATE/LASTNONBLANK/MAX -ve ekürileri- işlevleri itibariyle birbirine yakın gibi duran fonksiyonlar. Aralarında farklar var, hangisini kullanacağımızı bazen verinin yapısı belirliyor. LASTDATE sadece tarih tipindeki sütunlarla çalışırken LASTNONBLANK başka sütun tipleriyle de çalışabilir. Benzer şekilde MAX da sadece nümerik sütunlarla çalışır. Hatırlatayım! Tarih de aslında arka planda bir nümerik değer olarak tutulur.

MAX_ := MAX( 'Tarih'[Tarih] )

LASTNONBLANK ile LASTDATE arasındaki farklılıklara daha çok atıfta bulundum bu yazıda, bir sonrakinde her üç fonksiyonun benzerliklerini ve farklılıklarını biraz daha açmayı planlıyorum.

Yazıdaki modeli indirebilirsiniz.

Sadece üyeler görebilir. Hızlı üyelik için sosyal medya hesabınızla giriş yapabilirsiniz!

Bloga sosyal medya hesabınızla hızlı üye olmak için ilgili ikonu tıklayabilirsiniz.

Yorum yapın

PowerBI İstanbul

Microsoft Power BI, Microsoft Fabric, veriyle ilgili Azure servisleri, veri analitiği, iş zekası, veri modelleme ve veri görselleştirme üzerine Türkçe bilgi içeriğine katkı sağlamayı amaçlar.

Intellect BI blog sitesidir. Intellect BI & PowerBI İstanbul, Microsoft Data Analytics ve Power BI Partneri 'dir.

Blog Yazılarına Üye Olun

Blog yazıları, eğitim ve meetup duyuruları posta kutunuza gelsin!

9,6K Üye