FIRSTNONBLANK คืนค่าตัวแรกของ Column ที่ทำให้ Expression ไม่เป็น BLANK ใช้บ่อยเพื่อหา “ค่าแรกที่มีข้อมูล” เช่นวันแรกที่มียอดขาย (คืนค่าเป็นวันที่) และมักใช้ร่วมกับ time intelligence
=FIRSTNONBLANK(<Column>, <Expression>)
=FIRSTNONBLANK(<Column>, <Expression>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Column | column | Yes | คอลัมน์ที่ใช้เป็นลำดับในการหา “ตัวแรก” (เช่นคอลัมน์วันที่) ถ้าคอลัมน์มีแถวหลายพันแถว Performance อาจช้าลง | |
| Expression | expression | Yes | นิพจน์/Measure ที่ใช้ตรวจว่าแถวนั้นไม่เป็น BLANK เช่น [Total Sales] หรือ SUM(Sales[Amount]) |
คืนค่าเป็นวันที่แรกที่ [Total Sales] ไม่เป็น BLANK
คืนค่าจากคอลัมน์ (เช่นลูกค้า/สินค้า) ที่เป็นตัวแรกที่ expression มีค่า
วันแรกที่มียอด = FIRSTNONBLANK( 'Date'[Date], [Total Sales] )วันแรกที่มียอด =
FIRSTNONBLANK(
'Date'[Date],
[Total Sales]
)
ได้วันที่แรก (ตามลำดับ 'Date'[Date]) ที่ [Total Sales] ไม่เป็น BLANK
ยอดขายวันแรก = VAR firstDay = FIRSTNONBLANK('Date'[Date], [Total Sales]) RETURN CALCULATE( [Total Sales], 'Date'[Date] = firstDay )ยอดขายวันแรก =
VAR firstDay = FIRSTNONBLANK('Date'[Date], [Total Sales])
RETURN
CALCULATE(
[Total Sales],
'Date'[Date] = firstDay
)
ได้ยอดขายของวันแรกที่มีข้อมูล
ยอดขายวันแรก (ทางลัด) = FIRSTNONBLANKVALUE('Date'[Date], [Total Sales])=ยอดขายวันแรก (ทางลัด) =
FIRSTNONBLANKVALUE('Date'[Date], [Total Sales])
ได้ยอดขายของวันแรกที่มีข้อมูล โดยตรง
ลูกค้าแรก = FIRSTNONBLANK( Customers[CustomerID], CALCULATE(COUNTA(Orders[OrderID])) )ลูกค้าแรก =
FIRSTNONBLANK(
Customers[CustomerID],
CALCULATE(COUNTA(Orders[OrderID]))
)
ได้ CustomerID แรก ที่มีอย่างน้อย 1 Order
คืนค่า “จากคอลัมน์” (Column) ที่เป็นตัวแรกที่ทำให้ Expression ไม่เป็น BLANK เช่นคืนค่าเป็นวันที่ ไม่ใช่คืนค่าเป็นยอดขาย ถ้าต้องการคืนค่า Expression ให้ใช้ FIRSTNONBLANKVALUE
FIRSTNONBLANK: คืนค่า “จากคอลัมน์” (ตัวแรกที่ไม่ว่าง)
FIRSTNONBLANKVALUE: คืนค่า “ของ Expression” (ค่าคำนวณของตัวแรกที่ไม่ว่าง)
คิดง่ายๆ: FIRSTNONBLANK = return the date, FIRSTNONBLANKVALUE = return the sales amount
ไม่เหมือนกัน FIRSTDATE คืนค่าเป็น “ตารางวันที่แรกในบริบทเวลา” ส่วน FIRSTNONBLANK คืนค่าเป็น “ค่าจากคอลัมน์” ที่ทำให้ Expression ไม่เป็น BLANK ใช้ FIRSTNONBLANK เมื่อต้องพิจารณาเงื่อนไขเพิ่มเติม
ใช่ Microsoft ออกมาเตือนว่า FIRSTNONBLANK สามารถ “cause performance and memory issues” พอดี ถ้า Column มีแถวมากๆ (เช่น 1 ล้านแถว) ให้ระวัง หรือจะต้อง optimize ด้วยวิธีอื่น
ใช้ได้ใน Measure, Calculated Column, และ Calculated Table
แต่ใช้ไม่ได้ใน DirectQuery Calculated Column และ RLS rules
FIRSTNONBLANK คืน “ค่าตัวแรก” ของคอลัมน์ที่ระบุ ซึ่งทำให้ expression ที่ให้มา ไม่เป็น BLANK ตามลำดับของคอลัมน์นั้น มักใช้หา “วันแรกที่มีข้อมูล” (คืนค่าเป็นวันที่) หรือ “รายการแรกที่มีข้อมูล” ตามลำดับที่กำหนด
ส่วนตัวผม คิดว่า FIRSTNONBLANK เป็นฟังก์ชันที่ทำให้ DAX developers หลายคนสับสน เพราะมันคืนค่า “จากคอลัมน์” (column value) ไม่ใช่ “ค่าของ expression” ถ้าอยากได้ค่า expression โดยตรง ต้องใช้ FIRSTNONBLANKVALUE แทน นี่คือความแตกต่างที่ CRITICAL และหลายคนพลาดไป 😎
ข้อสำคัญอีกอย่าง: ฟังก์ชันนี้มีปัญหาเกี่ยวกับ Performance ตามเอกสาร Microsoft ถ้า Column มีแถวมากๆ ต้องระวัง อาจลดความเร็วของรายงาน
ถ้าต้องการคืน “ค่าของ expression” ของรายการแรกที่ไม่ว่าง ให้ดู FIRSTNONBLANKVALUE แทน