FIRSTNONBLANKVALUE คืนค่าแรกที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ซึ่งมีประโยชน์ในการหาค่าเริ่มต้นหรือค่าแรกที่มีข้อมูลจริง เช่นยอดขายของวันแรกที่มีการขาย
=FIRSTNONBLANKVALUE(<Column>, <Expression>)
=FIRSTNONBLANKVALUE(<Column>, <Expression>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Column | column | Yes | คอลัมน์ที่ใช้เป็นลำดับในการไล่ค่า มักจะเป็นวันที่ (Date Column) หรือคอลัมน์ที่มีค่าสามารถเรียงลำดับได้ ฟังก์ชันจะวิ่งตามลำดับจากน้อยไปมากของคอลัมน์นี้ | |
| Expression | expression | Yes | นิพจน์หรือ Measure ที่ต้องการคืนค่าแรกที่ไม่เป็น BLANK อาจเป็น SUM(), COUNT(), Measure ชื่อที่สร้างไว้แล้ว หรือสูตรใดๆ ที่คืนค่าเดี่ยว (Scalar) |
หา “ยอดขาย” ของวันแรกที่ [Total Sales] ไม่เป็น BLANK
คืนค่าสถานะครั้งแรกที่มีข้อมูลในช่วงเวลาที่เลือก
ใช้กับการกรองตามลูกค้า/สินค้า เพื่อหา “ค่าแรกที่มีข้อมูล” ภายในกลุ่มนั้น
ยอดขายวันแรก = FIRSTNONBLANKVALUE( 'Date'[Date], [Total Sales] )ยอดขายวันแรก =
FIRSTNONBLANKVALUE(
'Date'[Date],
[Total Sales]
)
ได้ยอดขายของวันแรก (ตามลำดับ 'Date'[Date]) ที่มีค่า Total Sales ไม่เป็น BLANK
ค่าคงคลังเปิดบัญชี = VAR ProductKey = SELECTEDVALUE('Product'[ProductKey]) RETURN FIRSTNONBLANKVALUE( 'Date'[Date], CALCULATE( SUM('Inventory'[Qty]), 'Product'[…ค่าคงคลังเปิดบัญชี =
VAR ProductKey = SELECTEDVALUE('Product'[ProductKey])
RETURN
FIRSTNONBLANKVALUE(
'Date'[Date],
CALCULATE(
SUM('Inventory'[Qty]),
'Product'[ProductKey] = ProductKey
)
)
ได้ปริมาณสินค้าของวันแรกที่สินค้านั้นมีบันทึกในระบบ
ยอดขายวันแรก (ในช่วงที่เลือก) = CALCULATE( FIRSTNONBLANKVALUE( 'Date'[Date], [Total Sales] ), ALLSELECTED('Date') )=ยอดขายวันแรก (ในช่วงที่เลือก) =
CALCULATE(
FIRSTNONBLANKVALUE(
'Date'[Date],
[Total Sales]
),
ALLSELECTED('Date')
)
ได้ยอดขายวันแรกที่ไม่ว่าง แต่ยังคำนึงถึงช่วงวันที่ผู้ใช้เลือกในรายงาน
สถานะแรก (ไม่ว่าง) = FIRSTNONBLANKVALUE( 'EventLog'[EventDate], SELECTEDVALUE('EventLog'[Status], "ไม่มีข้อมูล") )=สถานะแรก (ไม่ว่าง) =
FIRSTNONBLANKVALUE(
'EventLog'[EventDate],
SELECTEDVALUE('EventLog'[Status], "ไม่มีข้อมูล")
)
ได้สถานะแรกของเหตุการณ์ตามลำดับวันที่
เรื่องสำคัญที่ต้องเข้าใจ: FIRSTNONBLANK คืน “ตารางแรก” ที่สามารถใช้กับ CALCULATE เช่น CALCULATE(SUM(…), FIRSTNONBLANK(…)) ส่วน FIRSTNONBLANKVALUE คืน “ค่าเดี่ยว (Scalar)” โดยตรง ที่ได้จากการประเมิน Expression ในแถวแรกที่ไม่ว่าง ถ้าคุณต้องได้ตารางให้ใช้ FIRSTNONBLANK แต่ถ้าต้องได้ค่า (เลข, ข้อความ) ก็ใช้ FIRSTNONBLANKVALUE
ขึ้นกับการเรียงลำดับของคอลัมน์ที่ระบุ (Column Argument) ในบริบทตัวกรองปัจจุบัน โดยทั่วไปคือลำดับจากน้อยไปมาก (Ascending) เช่นถ้าใช้วันที่ก็จะเรียงจากวันเก่าสุดไปวันใหม่ ถ้าใช้ ID ตัวเลขก็จะเรียงจากน้อยไปมาก ถ้าต้องการคืนค่าจากส่วนท้าย ให้ใช้ LASTNONBLANKVALUE แทน
FIRSTNONBLANKVALUE มีข้อเตือนเกี่ยวกับประสิทธิภาพในเอกสาร Microsoft ด้วย เนื่องจากมันต้องไล่ค่าของคอลัมน์ทีละค่า (Iterator) จึงอาจใช้หน่วยความจำและเวลาในการประเมินมากถ้าคอลัมน์มีค่าที่ไม่ซ้ำมากๆ (High Cardinality) วิธีแก้คือ: 1) ตรวจสอบ Expression ว่ากำหนด Cardinality ของ Column ให้แคบลง (ใช้ FILTER ก่อน) 2) ประเมินว่าจำเป็นต้องใช้ FIRSTNONBLANKVALUE จริงๆ หรือเขียนเป็น CALCULATE + FIRSTNONBLANK + SUMMARIZE ก็ได้ผล
ตามเอกสาร Microsoft ฟังก์ชันนี้ \”ไม่สนับสนุน\” (Not Supported) ใน DirectQuery Mode เมื่อใช้ในการคำนวณคอลัมน์หรือ Row-Level Security (RLS) ถ้าโมเดลของคุณใช้ DirectQuery ลองเปลี่ยนเป็นโหมด Import หรือใช้ FIRSTNONBLANK + CALCULATETABLE แทน
ไม่บังคับว่าต้องเป็น Date Table เฉพาะว่า Column ที่ใช้ (Argument แรก) ต้องเป็นคอลัมน์ที่มีค่าสามารถเรียงลำดับได้ เช่นวันที่, ตัวเลข, ข้อความ (แต่ลำดับอักษรไม่เข้าใจธุรกิจส่วนมาก) ลองใช้คอลัมน์ใดก็ได้ตามที่มี แต่ค่อนข้างจะเหมาะกับคอลัมน์ที่มีลำดับหมายความ เช่นวันที่หรือลำดับเวลา
FIRSTNONBLANKVALUE เป็นฟังก์ชันที่ใช้หา ‘ค่าแรกที่ไม่ว่าง’ ของนิพจน์ (Expression) โดยไล่ตามลำดับของค่าในคอลัมน์ที่ระบุ มันวิ่งเข้าไปในแต่ละค่าของคอลัมน์ตามลำดับจากน้อยไปมาก (Natural Ascending Order) แล้วประเมิน Expression จนเจอผลลัพธ์ที่ไม่ใช่ BLANK จากนั้นให้หยุดและคืนค่านั้นกลับมา
ที่เจ๋งคือฟังก์ชันนี้ทำให้หาค่าแรกที่มีข้อมูลจริงได้ง่ายมาก เช่นอยากรู้ว่าในเดือนนี้วันแรกที่มียอดขายเป็นวันไหน และยอดขายนั้นเป็นเท่าไหร่? FIRSTNONBLANKVALUE ตอบได้พอดี โดยที่คุณไม่ต้องเขียน FILTER + MIN/MAX หรือโค้ดยุ่งๆ
ส่วนตัวผมชอบใช้ FIRSTNONBLANKVALUE ในการสร้าง Semi-Additive Measures (ยอดขายเปิดบัญชี, ค่าคงคลัง ณ วันแรก) หรือเมื่อต้องการ Opening Balance ตามลำดับวันที่ มันช่วยให้โค้ด DAX อ่านง่ายและประสิทธิภาพดีกว่าการเขียน CALCULATE+FILTER แบบซ้อนๆ ครับ