LASTNONBLANK คืนค่าตัวสุดท้ายจากคอลัมน์ที่ทำให้ expression ไม่เป็น BLANK ใช้บ่อยกับ semi-additive measures และเวลาต้องการหา “วันล่าสุดที่มีข้อมูล” ตามลำดับแถวของคอลัมน์
=LASTNONBLANK(<Column>, <Expression>)
=LASTNONBLANK(<Column>, <Expression>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Column | column | Yes | คอลัมน์ที่ใช้เป็น “ลำดับการค้นหา” (เช่น Date column, Product column ฯลฯ) LASTNONBLANK จะค้นหา “ตัวสุดท้าย” ของคอลัมน์นี้ ตามลำดับแถว | |
| Expression | expression | Yes | นิพจน์หรือ measure ที่ใช้เป็นเงื่อนไขตรวจสอบว่า “ไม่เป็น BLANK” เช่น [Total Sales], [Quantity], SUM(Orders[Amount]) ฯลฯ |
คืนค่าเป็นวันที่ล่าสุดที่ [Total Sales] ไม่เป็น BLANK
คืนค่าจากคอลัมน์ที่เป็นตัวสุดท้ายที่ expression มีค่า
Last Sales Date = LASTNONBLANK( 'Date'[Date], [Total Sales] )Last Sales Date =
LASTNONBLANK(
'Date'[Date],
[Total Sales]
)
2024-12-24 (หรือวันล่าสุดที่มีข้อมูล)
Sales Last Day = VAR lastDay = LASTNONBLANK( 'Date'[Date], [Total Sales] ) RETURN CALCULATE( [Total Sales], 'Date'[Date] = lastDay )Sales Last Day =
VAR lastDay = LASTNONBLANK(
'Date'[Date],
[Total Sales]
)
RETURN
CALCULATE(
[Total Sales],
'Date'[Date] = lastDay
)
ยอดขายของวันล่าสุดที่มีข้อมูล (เช่น 50000 บาท)
Ending Inventory = VAR lastInventoryDate = LASTNONBLANK( 'Date'[Date], [Inventory Qty] ) RETURN CALCULATE( [Inventory Qty], 'Date'[Date] = lastInventoryDate )Ending Inventory =
VAR lastInventoryDate = LASTNONBLANK(
'Date'[Date],
[Inventory Qty]
)
RETURN
CALCULATE(
[Inventory Qty],
'Date'[Date] = lastInventoryDate
)
1200 หน่วย (สต็อกของวันสุดท้ายที่นับสต็อก)
Ending Inventory (Shortcut) = VAR lastInventoryDate = LASTNONBLANK( 'Date'[Date], [Inventory Qty] ) RETURN CALCULATE( [Inventory Qty], 'Date'[Date] = lastInvent…=Ending Inventory (Shortcut) =
VAR lastInventoryDate = LASTNONBLANK(
'Date'[Date],
[Inventory Qty]
)
RETURN
CALCULATE(
[Inventory Qty],
'Date'[Date] = lastInventoryDate
)
-- หรือ ใช้ LASTNONBLANKVALUE ตรง ๆ --
Ending Inventory v2 =
LASTNONBLANKVALUE(
'Date'[Date],
[Inventory Qty]
)
1200 หน่วย (เหมือนเดิม)
LASTNONBLANK คืนค่า “จากคอลัมน์” (Column parameter) ที่เป็นตัวสุดท้ายที่ทำให้ Expression ไม่เป็น BLANK ไม่ใช่คืนค่าเป็นค่าของ expression อันนี้สำคัญมาก เช่น ถ้า Column เป็น Date column มันจะคืนค่าวันที่ (date value) ไม่ใช่คืนค่ายอดขาย ถ้าต้องคืนค่าของ expression โดยตรง ให้ใช้ LASTNONBLANKVALUE แทน
LASTNONBLANK หาตัว “สุดท้าย” ส่วน FIRSTNONBLANK หาตัว “แรก” ทั้งสองใช้ expression เดียวกันเป็นเงื่อนไข เช่น ถ้า [Total Sales] ไม่เป็น BLANK ผมนำ FIRSTNONBLANK ไปใช้บ่อยกับงานค้นหา “วันแรกที่เริ่มมีข้อมูล” ส่วน LASTNONBLANK คือ “วันล่าสุดที่มีข้อมูล”
LASTDATE คืนวันที่สุดท้ายในช่วงวันที่ของ Date table ตามบริบทตัวกรอง ไม่สนใจ expression ว่าว่างหรือไม่ ส่วน LASTNONBLANK มีเงื่อนไขเพิ่มเติม ว่า “expression ต้องไม่เป็น BLANK” ที่ LASTDATE ไปหา “วันล่าสุด” แต่ LASTNONBLANK หา “วันล่าสุดที่มีข้อมูลจริง ๆ” เช่น ถ้าวันที่สุดท้ายไม่มี sales เลย LASTDATE จะคืนวันนั้น แต่ LASTNONBLANK จะข้ามไปหาวันก่อนหน้าที่มี sales
ได้ครับ และแนะนำเลย โดยเฉพาะตัวอย่างที่ 2 และ 3 เพราะ LASTNONBLANK คืนตารางแถวเดียวคอลัมน์เดียว เอาค่านั้นเก็บใน VAR แล้วใช้หลายครั้งในสูตร ดีกว่าคำนวณซ้ำ ๆ ทำให้ clean code ขึ้น
สำคัญ 3 อย่าง: (1) ลำดับของแถวขึ้นกับลำดับตามธรรมชาติของ Column – ถ้า Column ไม่เรียง ผลลัพธ์อาจไม่ถูก (2) ต้องมีบริบทตัวกรองที่ดี – คนละบริบท ผลลัพธ์คนละแบบ (3) Performance – LASTNONBLANK อาจเป็น heavy operation บน dataset ใหญ่ ๆ Microsoft อยากให้ดู LASTNONBLANKVALUE หรือหา alternative ก่อน
LASTNONBLANK เป็นฟังก์ชัน time intelligence ที่ค้นหาตัวสุดท้ายของคอลัมน์ที่ระบุ ซึ่งทำให้ expression ที่ให้มา “ไม่เป็น BLANK” ตามลำดับของแถวในบริบทตัวกรองปัจจุบัน เวลาบอกว่า “ไม่เป็น BLANK” มันหมายความว่า expression นั้นคำนวณได้ค่าออกมา ไม่ใช่ว่าง ๆ หรือ NULL ใช้บ่อยในสถานการณ์ เช่น “วันล่าสุดที่ขายของ” “วันสุดท้ายที่มียอดขาย” หรือ “วันสุดท้ายที่มีข้อมูลจริง ๆ”
ที่เจ๋งคือ LASTNONBLANK ต่างจาก LASTDATE ตรงที่ LASTDATE มันแค่หา “วันล่าสุด” ตามลำดับวันทั่ว ๆ ไป แต่ LASTNONBLANK จะมีเงื่อนไขเพิ่มเติมว่า “ต้องจะบ่อยที่ expression นั้นไม่เป็น BLANK” ถ้า product ไหนไม่มีข้อมูลขายในบางวัน LASTNONBLANK จะข้ามไปหาวันล่าสุดที่มีข้อมูลจริง ๆ แบบนี้เหมาะมากกับสถานการณ์ที่ข้อมูลไม่ต่อเนื่อง
ส่วนตัวผมถือว่า LASTNONBLANK เป็น “นักสืบของ DAX” ที่ไปหาข้อมูลล่าสุดจริง ๆ ที่มีอยู่ไม่ใช่หาวันล่าสุดทั้งหมด ใช้ยุ่งกับแบบชุดข้อมูลแบบขาด ๆ หายๆ (sparse data) ผมแนะนำให้เข้าใจ CALCULATE กับ filter context ก่อน เพราะ LASTNONBLANK ทำงาน “ใจดี” เมื่อมี context transition เกิดขึ้น