LASTNONBLANK, FIRSTNONBLANK

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 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 kayıtlı üyeler görebilir. Giriş veya Üyelik için login.