FIRSTNONBLANKVALUE คืนค่าแรกที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ซึ่งมีประโยชน์ในการหาค่าเริ่มต้นหรือค่าแรกที่มีข้อมูลจริง เช่นยอดขายของวันแรกที่มีการขาย
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| Column | column | คอลัมน์ที่ใช้เป็นลำดับในการไล่ค่า มักจะเป็นวันที่ (Date Column) หรือคอลัมน์ที่มีค่าสามารถเรียงลำดับได้ ฟังก์ชันจะวิ่งตามลำดับจากน้อยไปมากของคอลัมน์นี้ |
| Expression | expression | นิพจน์หรือ Measure ที่ต้องการคืนค่าแรกที่ไม่เป็น BLANK อาจเป็น SUM(), COUNT(), Measure ชื่อที่สร้างไว้แล้ว หรือสูตรใดๆ ที่คืนค่าเดี่ยว (Scalar) |
FIRSTNONBLANKVALUE เป็นฟังก์ชันที่ใช้หา ‘ค่าแรกที่ไม่ว่าง’ ของนิพจน์ (Expression) โดยไล่ตามลำดับของค่าในคอลัมน์ที่ระบุ มันวิ่งเข้าไปในแต่ละค่าของคอลัมน์ตามลำดับจากน้อยไปมาก (Natural Ascending Order) แล้วประเมิน Expression จนเจอผลลัพธ์ที่ไม่ใช่ BLANK จากนั้นให้หยุดและคืนค่านั้นกลับมา
ที่เจ๋งคือฟังก์ชันนี้ทำให้หาค่าแรกที่มีข้อมูลจริงได้ง่ายมาก เช่นอยากรู้ว่าในเดือนนี้วันแรกที่มียอดขายเป็นวันไหน และยอดขายนั้นเป็นเท่าไหร่? FIRSTNONBLANKVALUE ตอบได้พอดี โดยที่คุณไม่ต้องเขียน FILTER + MIN/MAX หรือโค้ดยุ่งๆ
ส่วนตัวผมชอบใช้ FIRSTNONBLANKVALUE ในการสร้าง Semi-Additive Measures (ยอดขายเปิดบัญชี, ค่าคงคลัง ณ วันแรก) หรือเมื่อต้องการ Opening Balance ตามลำดับวันที่ มันช่วยให้โค้ด DAX อ่านง่ายและประสิทธิภาพดีกว่าการเขียน CALCULATE+FILTER แบบซ้อนๆ ครับ
หา “ยอดขาย” ของวันแรกที่ [Total Sales] ไม่เป็น BLANK
คืนค่าสถานะครั้งแรกที่มีข้อมูลในช่วงเวลาที่เลือก
ใช้กับการกรองตามลูกค้า/สินค้า เพื่อหา “ค่าแรกที่มีข้อมูล” ภายในกลุ่มนั้น
ฟังก์ชันเข้าไปไล่วันที่ตั้งแต่วันแรกของ Date table แล้วดูว่าในแต่ละวัน [Total Sales] มีค่ามั้ย ถ้าวันแรกไม่มี BLANK ก็ได้ค่านั้นเลย แต่ถ้า BLANK ก็เข้าไปดูวันถัดไป จนเจอค่าที่ไม่ใช่ BLANK
ใช้ VAR เก็บ ProductKey ที่เลือก แล้ว FIRSTNONBLANKVALUE ไล่วันที่เพื่อหาจำนวนสินค้าในวันแรกที่มีข้อมูล นี่คือการทำ Opening Balance แบบหลาวครับ
ALLSELECTED ช่วยให้การไล่ค่าอิงตามช่วงที่ผู้ใช้เลือก (เช่นเลือกเฉพาะปี 2024) มากกว่าถูกจำกัดโดย Filter Context อื่นๆ ใช้เวลาต้องการให้ผู้ใช้มีความยืดหยุ่นในการกรองข้อมูล
เมื่อมีการบันทึกเหตุการณ์หลายครั้ง แต่บางครั้งเก็บสถานะไว้หลังจากทำงาน ฟังก์ชันนี้ช่วยหาสถานะที่บันทึกครั้งแรกที่ไม่ว่าง
เรื่องสำคัญที่ต้องเข้าใจ: 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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
FIRSTDATE คืนค่าวันที่แรกในบริบทตัวกรองปัจจุบัน เหมาะใช้เป็นตัวกรองให้ CALCULATE เพื่อหายอดขาย/จำนวนของวันแรกในช่วงที่เลือก
FIRSTNONBLANK คืนค่าตัวแรกของ Column ที่ทำให้ Expression ไม่เป็น BLANK ใช้บ่อยเพื่อหา "ค่าแรกที่มีข้อมูล" เช่นวันแรกที่มียอดขาย (คืนค่าเป็นวันที่) และมักใช้ร่วมกับ time intelligence
LASTDATE คืนค่าตารางที่มีวันที่สุดท้ายในบริบทตัวกรองปัจจุบัน มักใช้เป็นตารางตัวกรองให้ CALCULATE เพื่อคำนวณ measure ณ วันสุดท้ายของช่วงที่เลือก และสามารถใช้ MAXX เพื่อแปลงผลเป็น scalar date ได้
LASTNONBLANKVALUE คืนค่าสุดท้ายที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ในบริบทตัวกรองปัจจุบัน ใช้หา "ค่าล่าสุดที่มีข้อมูล" เช่นยอดขายของวันล่าสุดที่มีค่า
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 ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
SELECTEDVALUE ตรวจสอบว่า Filter Context ลดลงเหลือเพียงค่าเดียวแล้ว ถ้าใช่ให้คืนค่านั้น ถ้าไม่ใช่ให้คืนค่าอื่นแทน
BLANK คืนค่าว่างเปล่า (Empty Value) ในDAX ซึ่งแตกต่างจาก 0 หรือ "" โดยใช้สำหรับระบุว่าไม่มีข้อมูล มักใช้ใน IF เพื่อซ่อนผลลัพธ์ที่ไม่ต้องการ
SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่