FIRSTNONBLANK คืนค่าตัวแรกของ Column ที่ทำให้ Expression ไม่เป็น BLANK ใช้บ่อยเพื่อหา “ค่าแรกที่มีข้อมูล” เช่นวันแรกที่มียอดขาย (คืนค่าเป็นวันที่) และมักใช้ร่วมกับ time intelligence
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| Column | column | คอลัมน์ที่ใช้เป็นลำดับในการหา “ตัวแรก” (เช่นคอลัมน์วันที่) ถ้าคอลัมน์มีแถวหลายพันแถว Performance อาจช้าลง |
| Expression | expression | นิพจน์/Measure ที่ใช้ตรวจว่าแถวนั้นไม่เป็น BLANK เช่น [Total Sales] หรือ SUM(Sales[Amount]) |
FIRSTNONBLANK คืน “ค่าตัวแรก” ของคอลัมน์ที่ระบุ ซึ่งทำให้ expression ที่ให้มา ไม่เป็น BLANK ตามลำดับของคอลัมน์นั้น มักใช้หา “วันแรกที่มีข้อมูล” (คืนค่าเป็นวันที่) หรือ “รายการแรกที่มีข้อมูล” ตามลำดับที่กำหนด
ส่วนตัวผม คิดว่า FIRSTNONBLANK เป็นฟังก์ชันที่ทำให้ DAX developers หลายคนสับสน เพราะมันคืนค่า “จากคอลัมน์” (column value) ไม่ใช่ “ค่าของ expression” ถ้าอยากได้ค่า expression โดยตรง ต้องใช้ FIRSTNONBLANKVALUE แทน นี่คือความแตกต่างที่ CRITICAL และหลายคนพลาดไป 😎
ข้อสำคัญอีกอย่าง: ฟังก์ชันนี้มีปัญหาเกี่ยวกับ Performance ตามเอกสาร Microsoft ถ้า Column มีแถวมากๆ ต้องระวัง อาจลดความเร็วของรายงาน
ถ้าต้องการคืน “ค่าของ expression” ของรายการแรกที่ไม่ว่าง ให้ดู FIRSTNONBLANKVALUE แทน
คืนค่าเป็นวันที่แรกที่ [Total Sales] ไม่เป็น BLANK
คืนค่าจากคอลัมน์ (เช่นลูกค้า/สินค้า) ที่เป็นตัวแรกที่ expression มีค่า
คืนค่าเป็น "วันที่" (ค่าจาก Column) ไม่ใช่ยอดขาย ถ้า Date table มี 3650 วัน แล้ววันแรกที่มีข้อมูลขายคือวันที่ 2020-01-15 ก็จะคืนค่านั้นมา
FIRSTNONBLANK คืนค่าเป็นวันที่ แล้วบันทึกไว้ใน VAR ชื่อ firstDay จากนั้นใช้ CALCULATE เพื่อกรองข้อมูลเฉพาะวันนั้นแล้วหา [Total Sales]
FIRSTNONBLANKVALUE ถูกออกแบบมาเพื่อคืนค่าของ Expression สำหรับตัวแรกที่ไม่ว่าง ไม่ต้องคู่กับ CALCULATE
วน Loop ไปในแต่ละ CustomerID ตามลำดับ แล้วตรวจว่า Order count ไม่เป็น BLANK คืนค่า CustomerID แรกที่พบ
คืนค่า "จากคอลัมน์" (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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
FIRSTDATE คืนค่าวันที่แรกในบริบทตัวกรองปัจจุบัน เหมาะใช้เป็นตัวกรองให้ CALCULATE เพื่อหายอดขาย/จำนวนของวันแรกในช่วงที่เลือก
FIRSTNONBLANKVALUE คืนค่าแรกที่ไม่เป็น BLANK ของ Expression เมื่อประเมินตามลำดับของ Column ซึ่งมีประโยชน์ในการหาค่าเริ่มต้นหรือค่าแรกที่มีข้อมูลจริง เช่นยอดขายของวันแรกที่มีการขาย
LASTDATE คืนค่าตารางที่มีวันที่สุดท้ายในบริบทตัวกรองปัจจุบัน มักใช้เป็นตารางตัวกรองให้ CALCULATE เพื่อคำนวณ measure ณ วันสุดท้ายของช่วงที่เลือก และสามารถใช้ MAXX เพื่อแปลงผลเป็น scalar date ได้
LASTNONBLANK คืนค่าตัวสุดท้ายจากคอลัมน์ที่ทำให้ expression ไม่เป็น BLANK ใช้บ่อยกับ semi-additive measures และเวลาต้องการหา "วันล่าสุดที่มีข้อมูล" ตามลำดับแถวของคอลัมน์
BLANK คืนค่าว่างเปล่า (Empty Value) ในDAX ซึ่งแตกต่างจาก 0 หรือ "" โดยใช้สำหรับระบุว่าไม่มีข้อมูล มักใช้ใน IF เพื่อซ่อนผลลัพธ์ที่ไม่ต้องการ
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
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่