Thep Excel

FIRSTNONBLANKVALUEค่าแรกที่ไม่ว่างตามลำดับของคอลัมน์

FIRSTNONBLANKVALUE คืนค่าแรกที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ซึ่งมีประโยชน์ในการหาค่าเริ่มต้นหรือค่าแรกที่มีข้อมูลจริง เช่นยอดขายของวันแรกที่มีการขาย

fx
=FIRSTNONBLANKVALUE(<Column>, <Expression>)

ความนิยม5/10
ความยาก4/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
Column column คอลัมน์ที่ใช้เป็นลำดับในการไล่ค่า มักจะเป็นวันที่ (Date Column) หรือคอลัมน์ที่มีค่าสามารถเรียงลำดับได้ ฟังก์ชันจะวิ่งตามลำดับจากน้อยไปมากของคอลัมน์นี้
Expression expression นิพจน์หรือ Measure ที่ต้องการคืนค่าแรกที่ไม่เป็น BLANK อาจเป็น SUM(), COUNT(), Measure ชื่อที่สร้างไว้แล้ว หรือสูตรใดๆ ที่คืนค่าเดี่ยว (Scalar)

Additional Notes

FIRSTNONBLANKVALUE เป็นฟังก์ชันที่ใช้หา ‘ค่าแรกที่ไม่ว่าง’ ของนิพจน์ (Expression) โดยไล่ตามลำดับของค่าในคอลัมน์ที่ระบุ มันวิ่งเข้าไปในแต่ละค่าของคอลัมน์ตามลำดับจากน้อยไปมาก (Natural Ascending Order) แล้วประเมิน Expression จนเจอผลลัพธ์ที่ไม่ใช่ BLANK จากนั้นให้หยุดและคืนค่านั้นกลับมา

ที่เจ๋งคือฟังก์ชันนี้ทำให้หาค่าแรกที่มีข้อมูลจริงได้ง่ายมาก เช่นอยากรู้ว่าในเดือนนี้วันแรกที่มียอดขายเป็นวันไหน และยอดขายนั้นเป็นเท่าไหร่? FIRSTNONBLANKVALUE ตอบได้พอดี โดยที่คุณไม่ต้องเขียน FILTER + MIN/MAX หรือโค้ดยุ่งๆ

ส่วนตัวผมชอบใช้ FIRSTNONBLANKVALUE ในการสร้าง Semi-Additive Measures (ยอดขายเปิดบัญชี, ค่าคงคลัง ณ วันแรก) หรือเมื่อต้องการ Opening Balance ตามลำดับวันที่ มันช่วยให้โค้ด DAX อ่านง่ายและประสิทธิภาพดีกว่าการเขียน CALCULATE+FILTER แบบซ้อนๆ ครับ

How it works

ยอดขายวันแรกที่มียอด (คืนค่าเป็นยอดขาย)

หา “ยอดขาย” ของวันแรกที่ [Total Sales] ไม่เป็น BLANK

ค่าแรกของสถานะ/ข้อความที่ไม่ว่างตามเวลา

คืนค่าสถานะครั้งแรกที่มีข้อมูลในช่วงเวลาที่เลือก

ค่าแรกที่เกิดขึ้นในกลุ่ม

ใช้กับการกรองตามลูกค้า/สินค้า เพื่อหา “ค่าแรกที่มีข้อมูล” ภายในกลุ่มนั้น

Examples

ตัวอย่างที่ 1: หายอดขายของวันแรกที่มีข้อมูลยอดขายวันแรก = FIRSTNONBLANKVALUE( 'Date'[Date], [Total Sales] )

ฟังก์ชันเข้าไปไล่วันที่ตั้งแต่วันแรกของ Date table แล้วดูว่าในแต่ละวัน [Total Sales] มีค่ามั้ย ถ้าวันแรกไม่มี BLANK ก็ได้ค่านั้นเลย แต่ถ้า BLANK ก็เข้าไปดูวันถัดไป จนเจอค่าที่ไม่ใช่ BLANK

fx
ยอดขายวันแรก =
FIRSTNONBLANKVALUE(
'Date'[Date],
[Total Sales]
)

ผลลัพธ์ได้ยอดขายของวันแรก (ตามลำดับ 'Date'[Date]) ที่มีค่า Total Sales ไม่เป็น BLANK
ตัวอย่างที่ 2: หาค่าคงคลัง (Inventory) ของวันแรกเมื่อเปิดบัญชีค่าคงคลังเปิดบัญชี = VAR ProductKey = SELECTEDVALUE('Product'[ProductKey]) RETURN FIRSTNONBLANKVALUE( 'Date'[Date], CALCULATE( SUM('Inventory'[Qty]), 'Product'[…

ใช้ VAR เก็บ ProductKey ที่เลือก แล้ว FIRSTNONBLANKVALUE ไล่วันที่เพื่อหาจำนวนสินค้าในวันแรกที่มีข้อมูล นี่คือการทำ Opening Balance แบบหลาวครับ

fx
ค่าคงคลังเปิดบัญชี =
VAR ProductKey = SELECTEDVALUE('Product'[ProductKey])
RETURN
FIRSTNONBLANKVALUE(
'Date'[Date],
CALCULATE(
SUM('Inventory'[Qty]),
'Product'[ProductKey] = ProductKey
)
)

ผลลัพธ์ได้ปริมาณสินค้าของวันแรกที่สินค้านั้นมีบันทึกในระบบ
ตัวอย่างที่ 3: ใช้กับการกรองของรายงาน (ร่วมกับ ALLSELECTED)ยอดขายวันแรก (ในช่วงที่เลือก) = CALCULATE( FIRSTNONBLANKVALUE( 'Date'[Date], [Total Sales] ), ALLSELECTED('Date') )

ALLSELECTED ช่วยให้การไล่ค่าอิงตามช่วงที่ผู้ใช้เลือก (เช่นเลือกเฉพาะปี 2024) มากกว่าถูกจำกัดโดย Filter Context อื่นๆ ใช้เวลาต้องการให้ผู้ใช้มีความยืดหยุ่นในการกรองข้อมูล

fx
=ยอดขายวันแรก (ในช่วงที่เลือก) =
CALCULATE(
FIRSTNONBLANKVALUE(
'Date'[Date],
[Total Sales]
),
ALLSELECTED('Date')
)

ผลลัพธ์ได้ยอดขายวันแรกที่ไม่ว่าง แต่ยังคำนึงถึงช่วงวันที่ผู้ใช้เลือกในรายงาน
ตัวอย่างที่ 4: หาสถานะแรกที่ไม่ว่างของเหตุการณ์สถานะแรก (ไม่ว่าง) = FIRSTNONBLANKVALUE( 'EventLog'[EventDate], SELECTEDVALUE('EventLog'[Status], "ไม่มีข้อมูล") )

เมื่อมีการบันทึกเหตุการณ์หลายครั้ง แต่บางครั้งเก็บสถานะไว้หลังจากทำงาน ฟังก์ชันนี้ช่วยหาสถานะที่บันทึกครั้งแรกที่ไม่ว่าง

fx
=สถานะแรก (ไม่ว่าง) =
FIRSTNONBLANKVALUE(
'EventLog'[EventDate],
SELECTEDVALUE('EventLog'[Status], "ไม่มีข้อมูล")
)

ผลลัพธ์ได้สถานะแรกของเหตุการณ์ตามลำดับวันที่

FAQs

ต่างจาก FIRSTNONBLANK อย่างไร?+

เรื่องสำคัญที่ต้องเข้าใจ: FIRSTNONBLANK คืน "ตารางแรก" ที่สามารถใช้กับ CALCULATE เช่น CALCULATE(SUM(…), FIRSTNONBLANK(…)) ส่วน FIRSTNONBLANKVALUE คืน "ค่าเดี่ยว (Scalar)" โดยตรง ที่ได้จากการประเมิน Expression ในแถวแรกที่ไม่ว่าง ถ้าคุณต้องได้ตารางให้ใช้ FIRSTNONBLANK แต่ถ้าต้องได้ค่า (เลข, ข้อความ) ก็ใช้ FIRSTNONBLANKVALUE

ลำดับการไล่ค่า (Natural Ascending Order) มาจากไหน?+

ขึ้นกับการเรียงลำดับของคอลัมน์ที่ระบุ (Column Argument) ในบริบทตัวกรองปัจจุบัน โดยทั่วไปคือลำดับจากน้อยไปมาก (Ascending) เช่นถ้าใช้วันที่ก็จะเรียงจากวันเก่าสุดไปวันใหม่ ถ้าใช้ ID ตัวเลขก็จะเรียงจากน้อยไปมาก ถ้าต้องการคืนค่าจากส่วนท้าย ให้ใช้ LASTNONBLANKVALUE แทน

ทำไมบางครั้งฟังก์ชันนี้ช้าหรือ Error?+

FIRSTNONBLANKVALUE มีข้อเตือนเกี่ยวกับประสิทธิภาพในเอกสาร Microsoft ด้วย เนื่องจากมันต้องไล่ค่าของคอลัมน์ทีละค่า (Iterator) จึงอาจใช้หน่วยความจำและเวลาในการประเมินมากถ้าคอลัมน์มีค่าที่ไม่ซ้ำมากๆ (High Cardinality) วิธีแก้คือ: 1) ตรวจสอบ Expression ว่ากำหนด Cardinality ของ Column ให้แคบลง (ใช้ FILTER ก่อน) 2) ประเมินว่าจำเป็นต้องใช้ FIRSTNONBLANKVALUE จริงๆ หรือเขียนเป็น CALCULATE + FIRSTNONBLANK + SUMMARIZE ก็ได้ผล

ใช้ได้กับ DirectQuery หรือเปล่า?+

ตามเอกสาร Microsoft ฟังก์ชันนี้ \"ไม่สนับสนุน\" (Not Supported) ใน DirectQuery Mode เมื่อใช้ในการคำนวณคอลัมน์หรือ Row-Level Security (RLS) ถ้าโมเดลของคุณใช้ DirectQuery ลองเปลี่ยนเป็นโหมด Import หรือใช้ FIRSTNONBLANK + CALCULATETABLE แทน

ต้องมี Date Table มั้ย?+

ไม่บังคับว่าต้องเป็น Date Table เฉพาะว่า Column ที่ใช้ (Argument แรก) ต้องเป็นคอลัมน์ที่มีค่าสามารถเรียงลำดับได้ เช่นวันที่, ตัวเลข, ข้อความ (แต่ลำดับอักษรไม่เข้าใจธุรกิจส่วนมาก) ลองใช้คอลัมน์ใดก็ได้ตามที่มี แต่ค่อนข้างจะเหมาะกับคอลัมน์ที่มีลำดับหมายความ เช่นวันที่หรือลำดับเวลา

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ FIRSTNONBLANKVALUE จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้FIRSTNONBLANKVALUETime Intelligence
Time Intelligence (4)
FIRSTDATE

FIRSTDATE คืนค่าวันที่แรกในบริบทตัวกรองปัจจุบัน เหมาะใช้เป็นตัวกรองให้ CALCULATE เพื่อหายอดขาย/จำนวนของวันแรกในช่วงที่เลือก

FIRSTNONBLANK

FIRSTNONBLANK คืนค่าตัวแรกของ Column ที่ทำให้ Expression ไม่เป็น BLANK ใช้บ่อยเพื่อหา "ค่าแรกที่มีข้อมูล" เช่นวันแรกที่มียอดขาย (คืนค่าเป็นวันที่) และมักใช้ร่วมกับ time intelligence

LASTDATE

LASTDATE คืนค่าตารางที่มีวันที่สุดท้ายในบริบทตัวกรองปัจจุบัน มักใช้เป็นตารางตัวกรองให้ CALCULATE เพื่อคำนวณ measure ณ วันสุดท้ายของช่วงที่เลือก และสามารถใช้ MAXX เพื่อแปลงผลเป็น scalar date ได้

LASTNONBLANKVALUE

LASTNONBLANKVALUE คืนค่าสุดท้ายที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ในบริบทตัวกรองปัจจุบัน ใช้หา "ค่าล่าสุดที่มีข้อมูล" เช่นยอดขายของวันล่าสุดที่มีค่า

Filter (3)
CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

SELECTEDVALUE

SELECTEDVALUE ตรวจสอบว่า Filter Context ลดลงเหลือเพียงค่าเดียวแล้ว ถ้าใช่ให้คืนค่านั้น ถ้าไม่ใช่ให้คืนค่าอื่นแทน

Other (1)
BLANK

BLANK คืนค่าว่างเปล่า (Empty Value) ในDAX ซึ่งแตกต่างจาก 0 หรือ "" โดยใช้สำหรับระบุว่าไม่มีข้อมูล มักใช้ใน IF เพื่อซ่อนผลลัพธ์ที่ไม่ต้องการ

Table manipulation (1)
SUMMARIZECOLUMNS

SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่