MIN คืนค่าน้อยที่สุดจากคอลัมน์ภายใต้ filter context ปัจจุบัน หรือเปรียบเทียบสองค่า scalar expression แล้วคืนค่าที่น้อยกว่า รองรับตัวเลข วันที่ และข้อความ ทำงานภายใต้ filter context ทำให้ค่าที่หาได้จะถูกกรองตาม slicer หรือ visual filter อัตโนมัติ เหมาะกับการหาราคาต่ำสุด วันที่เร็วที่สุด หรือการตั้งเพดาน (cap) ให้กับค่าคำนวณ
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| column | column | คอลัมน์ที่ต้องการหาค่าน้อยที่สุด รองรับตัวเลข วันที่ หรือข้อความ ทำงานภายใต้ filter context ปัจจุบัน และข้ามค่า BLANK ไป ถ้าใช้รูปแบบนี้ไม่ต้องระบุ expression1 และ expression2 | |
| [expression1]ไม่บังคับ | scalar | ไม่มี (ใช้รูปแบบ column เดียว) | ค่า scalar expression ตัวแรกสำหรับการเปรียบเทียบ (ใช้เมื่อเรียก MIN แบบ 2 arguments) อาจเป็น measure, ค่าคงที่ หรือ expression ที่คืนค่าเดียว ถ้าค่านี้เป็น BLANK ผลลัพธ์จะเป็น BLANK |
| [expression2]ไม่บังคับ | scalar | ไม่มี (ใช้รูปแบบ column เดียว) | ค่า scalar expression ตัวที่สองสำหรับการเปรียบเทียบ (ใช้เมื่อเรียก MIN แบบ 2 arguments) อาจเป็น measure, ค่าคงที่ หรือ expression ที่คืนค่าเดียว ถ้าค่านี้เป็น BLANK ผลลัพธ์จะเป็น BLANK |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
MIN เป็น aggregation function ที่คืนค่าน้อยที่สุดจากคอลัมน์ภายใต้ filter context ปัจจุบัน หรือเปรียบเทียบสองค่า scalar expression แล้วคืนค่าที่น้อยกว่า
.
รองรับข้อมูลประเภทตัวเลข วันที่ และข้อความ (เรียงตามลำดับตัวอักษร) ใช้บ่อยในการหาค่าต่ำสุด เช่น ราคาต่ำสุด วันที่เร็วที่สุด หรือการตั้งเพดาน (cap) ให้กับค่าคำนวณ
.
MIN ทำงานภายใต้ filter context ใน measure และสามารถ evaluate ได้ทั้งใน calculated column, calculated table และ measure ครับ 💡
MIN ทำงานภายใต้ filter context ปัจจุบัน หมายความว่าค่าที่หาได้จะถูกกรองตาม slicer, visual filter หรือ CALCULATE function ตัวอย่างเช่น ถ้ากรองเฉพาะสินค้าหมวด “Electronics” ค่า MIN จะหาราคาต่ำสุดเฉพาะสินค้าในหมวดนั้น ไม่ใช่ราคาต่ำสุดของทั้งตาราง ใน measure นี้เป็นพื้นฐานการทำงานที่สำคัญที่สุด
MIN จัดการค่า BLANK แตกต่างกันขึ้นกับรูปแบบการใช้งาน:
⚠️ ข้อควรระวัง: DAX Guide ระบุว่า MIN แบบ 2 arguments “ถือว่า BLANK เป็นค่าที่มีนัยสำคัญ” (considers BLANK as significative) ซึ่งหมายความว่าถ้าอย่างน้อย 1 argument เป็น BLANK ผลลัพธ์จะเป็น BLANK ตัวอย่างจาก DAX Guide: MIN(2, BLANK()) คืนค่า BLANK ในขณะที่ MINX({2, BLANK()}, [Value]) คืนค่า 2 ความแตกต่างนี้สำคัญมากเมื่อเปรียบเทียบ MIN กับ MINX
MIN ใช้กับคอลัมน์ที่มีอยู่แล้วในตาราง หรือเปรียบเทียบสองค่า scalar ไม่มีการ iterate แต่ละ row แยก ส่วน MINX เป็น iterator function ที่วนลูปแต่ละ row ในตารางและประเมิน expression ต่อ row ก่อนหาค่าต่ำสุด ใช้ MIN เมื่อต้องการหาค่าต่ำสุดของคอลัมน์โดยตรง เช่น MIN(Products[Price]) และใช้ MINX เมื่อต้องคำนวณค่าต่อ row ก่อน เช่น MINX(Sales, Sales[Quantity] * Sales[UnitPrice]) ตาม DAX Guide เมื่อใช้ MIN กับ column เดียว DAX engine จะ optimize เป็น MINX ภายในโดยอัตโนมัติ โดยไม่มีความแตกต่างด้าน performance
MIN รองรับการเปรียบเทียบข้อความตามลำดับตัวอักษร (alphabetical order) โดย “A” น้อยกว่า “Z” และตัวพิมพ์เล็กน้อยกว่าตัวพิมพ์ใหญ่ในบางกรณี แต่ในทางปฏิบัติการใช้ MIN กับข้อความมักไม่มีความหมายทางธุรกิจมากนัก ส่วนใหญ่ใช้กับตัวเลขและวันที่
หาราคาต่ำสุด วันที่เร็วที่สุด หรือค่าต่ำสุดของข้อมูลที่อยู่ในบริบทปัจจุบัน ใช้ใน measure และ visual
จำกัดค่า measure ไม่ให้สูงเกินค่าที่กำหนด เช่น discount rate ไม่เกิน 30% หรือ commission rate ไม่เกิน 15%
เลือกค่าที่น้อยกว่าระหว่างสอง measure เช่น เปรียบเทียบ actual กับ budget แล้วเลือกค่าที่ต่ำกว่า
หา first order date หรือ earliest transaction date ในช่วงที่กรอง ใช้กับ time intelligence analysis
นี่คือการใช้งาน MIN แบบพื้นฐานในรูปแบบ measure โดยระบุเฉพาะ column เดียว MIN จะหาค่าต่ำสุดจากคอลัมน์ Products[Price] ภายใต้ filter context ปัจจุบัน
ตัวอย่างเช่น ถ้ามี slicer กรองเฉพาะหมวด "Electronics" MIN จะคืนราคาต่ำสุดเฉพาะสินค้าในหมวดนั้น ไม่ใช่ราคาต่ำสุดของทั้งตาราง ซึ่งเป็นจุดเด่นของ aggregation function ที่ทำงานภายใต้ filter context
ค่า BLANK จะถูกข้ามไป และถ้าทุก row เป็น BLANK จะคืน BLANK ครับ
เมื่อใช้ใน table visual ที่มี Customers[CustomerName] ใน row, measure นี้จะคืนวันที่ order แรกของแต่ละลูกค้า เพราะ filter context ของแต่ละ row ในตาราง visual จะกรองเฉพาะ order ของลูกค้าคนนั้น
สังเกตนะครับว่า MIN กับคอลัมน์วันที่จะคืนวันที่เร็วที่สุด (earliest date) เนื่องจากวันที่เก่าจะมีค่าน้อยกว่า ซึ่งอาจฟังดูสับสนนิดนึง แต่พอเข้าใจแล้วก็ใช้งานได้ง่ายมาก 😎
นี่เป็นวิธีหา first order date ที่ใช้บ่อยใน customer analysis และ time intelligence ครับ
ใช้ VAR เพื่อคำนวณ discount rate จริงจาก Sales[DiscountAmount] หาร Sales[SalesAmount] ก่อน แล้วใช้ MIN แบบ 2 arguments เปรียบเทียบกับ 0.30 (30%)
ถ้า ActualDiscount มากกว่า 0.30 MIN จะคืน 0.30 (เพดาน) แต่ถ้าน้อยกว่าจะคืนค่าจริง ง่ายๆ เลยครับ
วิธีนี้ช่วยจำกัดค่าไม่ให้เกินเพดานที่กำหนด เหมาะกับการทำ data visualization ที่ต้องการ cap outliers หรือจำกัดช่วงค่าให้อยู่ในระดับที่เหมาะสม ส่วนตัวผมใช้เทคนิคนี้บ่อยมากเวลาทำ dashboard ที่มีค่าพุ่งสูงผิดปกติครับ 💡
ใช้ VAR เก็บค่า TotalBudget จาก Budget table และ TotalActual จาก Sales table ไว้ก่อน จากนั้นใช้ MIN แบบ 2 arguments เปรียบเทียบสองค่านี้แล้วคืนค่าที่ต่ำกว่า
วิธีนี้มีประโยชน์ในการวิเคราดี์ว่าควรจัดสรร resource ตามค่าไหน บางครั้ง budget อาจต่ำกว่า actual ในกรณีที่ขายดีเกินคาด ซึ่งเราก็ต้องเลือกว่าจะใช้ค่าไหนเป็นฐานในการวางแผนต่อไป
การใช้ VAR ทำให้ formula อ่านง่ายและหลีกเลี่ยงการคำนวณซ้ำ ซึ่งช่วยเรื่อง performance ใน large dataset มากครับ โดยเฉพาะเมื่อ expression ซับซ้อน
ใช้ใน calculated column ของตาราง Products เพื่อเปรียบเทียบราคาสินค้าแต่ละตัวกับราคาต่ำสุดในหมวดเดียวกัน
ต้องใช้ CALCULATE เพื่อสร้าง filter context (เพราะ calculated column ทำงานใน row context โดยปกติ) และใช้ ALLEXCEPT เพื่อลบ filter ทุกคอลัมน์ยกเว้น Products[Category] ทำให้ MIN หาค่าต่ำสุดของทั้งหมวดหมู่
จากนั้นสามารถใช้ column นี้คำนวณว่าสินค้าแต่ละตัวแพงกว่าราคาต่ำสุดของหมวดเท่าไหร่ เหมาะกับการวิเคราะห์ pricing strategy ครับ เช่น ถ้าสินค้าตัวไหนแพงกว่าราคาต่ำสุดของหมวดมากเกินไป อาจต้องปรับกลยุทธ์
MIN ใช้กับคอลัมน์ที่มีอยู่แล้ว หรือเปรียบเทียบสองค่า scalar ไม่มี row context แยก ส่วน MINX เป็น iterator function ที่วนลูปแต่ละ row ในตารางและประเมิน expression ต่อแถวก่อนหาค่าต่ำสุด
ใช้ MIN เมื่อต้องการหาค่าต่ำสุดของคอลัมน์โดยตรง เช่น MIN(Products[Price]) และใช้ MINX เมื่อต้องคำนวณค่าต่อแถวก่อน เช่น MINX(Sales, Sales[Quantity] * Sales[UnitPrice]) เพื่อหา line total ต่ำสุด
ที่น่าสนใจคือ ตาม DAX Guide เมื่อใช้ MIN กับ column เดียว DAX engine จะ optimize เป็น MINX ภายในโดยอัตโนมัติ โดยไม่มีความแตกต่างด้าน performance ครับ
การจัดการ BLANK แตกต่างตามรูปแบบการใช้งาน:
(1) MIN แบบ 1 argument (column) จะข้าม BLANK ไปและหาค่าต่ำสุดจากค่าที่ไม่ใช่ BLANK ถ้าทุกแถวเป็น BLANK จะคืน BLANK
(2) MIN แบบ 2 arguments (scalar comparison) มีความซับซ้อนมากกว่า โดย Microsoft Learn ระบุว่า BLANK ถูกปฏิบัติเหมือน 0 แต่ DAX Guide ระบุว่า MIN ถือว่า BLANK เป็นค่าที่มีนัยสำคัญ (significative) และถ้าอย่างน้อย 1 argument เป็น BLANK ผลลัพธ์จะเป็น BLANK
ตัวอย่างเช่น MIN(2, BLANK()) คืน BLANK แต่ถ้าทั้งสองค่าเป็น BLANK จะคืน BLANK เช่นกัน ⚠️ ข้อควรระวังคือพื้นฐานนี้อาจส่งผลต่อ formula ที่ไม่คาดคิดนะครับ
ได้ครับ MIN รองรับการเปรียบเทียบข้อความตามลำดับตัวอักษร (alphabetical order) เช่น MIN(Products[ProductName]) จะคืนชื่อสินค้าที่เรียงตามตัวอักษรลำดับแรก ("A" มาก่อน "Z") และตัวพิมพ์เล็กน้อยกว่าตัวพิมพ์ใหญ่ในบางกรณี
แต่… ในทางปฏิบัติการใช้ MIN กับข้อความมักไม่มีความหมายทางธุรกิจมากนักนะครับ ส่วนใหญ่ใช้กับตัวเลขและวันที่ เนื่องจากการหา "ชื่อแรกสุด" ตามตัวอักษรมักไม่ได้ให้ insight ที่มีค่า
ใน calculated column, MIN ทำงานใน row context โดยปกติ ต้องใช้ CALCULATE เพื่อสร้าง filter context ถ้าต้องการหาค่าต่ำสุดของกลุ่ม เช่น CALCULATE(MIN(Products[Price]), ALLEXCEPT(Products, Products[Category]))
ส่วนใน measure, MIN ทำงานใน filter context โดยตรง และจะหาค่าต่ำสุดของแถวที่ผ่าน filter ปัจจุบัน
ส่วนใหญ่แล้ว MIN มักใช้ใน measure เพราะเหมาะกับการวิเคราะห์ค่าต่ำสุดใน visual ที่มี filter context จาก slicer หรือ visual filter ครับ
ได้ครับ MIN รองรับ date column และจะคืนวันที่เร็วที่สุด (วันที่ที่มีค่าน้อยที่สุด) เนื่องจากวันที่เก่าจะมีค่าน้อยกว่าวันที่ใหม่ในระบบวันที่ของ DAX
ตัวอย่างเช่น MIN(Sales[OrderDate]) จะคืนวันที่ order แรก และ MIN(Sales[ShipDate]) จะคืนวันที่ ship เร็วที่สุด
นี่เป็นวิธีหา first order date หรือ earliest transaction date ที่ใช้บ่อยมากใน time intelligence analysis และ customer lifetime value calculation ครับ
โดยทั่วไป MIN มี performance ดีกว่า MINX เพราะไม่ต้อง iterate แต่ละ row แยก
แต่… ตาม DAX Guide ระบุว่าเมื่อใช้ MIN กับ column เดียว DAX engine จะ optimize เป็น MINX ภายในโดยอัตโนมัติโดยไม่มีความแตกต่างด้าน performance เลยนะครับ
ดังนั้นถ้าต้องการหาค่าต่ำสุดของคอลัมน์โดยตรงใช้ MIN ได้เลย (เพราะอ่านง่ายกว่า) แต่ถ้าต้องคำนวณ expression ต่อแถวก่อนหาค่าต่ำสุดจำเป็นต้องใช้ MINX ครับ
ใช้ MIN แบบ 2 arguments โดยเปรียบเทียบค่าจริงกับค่าเพดาน เช่น MIN([ActualValue], 100) จะคืนค่าจริงถ้าน้อยกว่า 100 หรือคืน 100 ถ้าค่าจริงมากกว่า
วิธีนี้เหมาะกับการจำกัดค่าไม่ให้เกินเพดาน เช่น:
• discount rate ไม่เกิน 30%: MIN([DiscountRate], 0.30)
• commission rate ไม่เกิน 15%: MIN([CommissionRate], 0.15)
ช่วยทำ data visualization ที่มี outliers ให้อยู่ในช่วงที่เหมาะสม และป้องกันค่าที่ผิดปกติจากการ skew การวิเคราะห์ครับ ส่วนตัวผมใช้บ่อยมากเวลาทำ dashboard นะ 💡
ฟังก์ชันที่ผู้เขียนโยงไว้กับ MIN จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
MAX คืนค่าสูงสุดจากคอลัมน์ภายใต้ filter context หรือเปรียบเทียบสองค่าสเกลาร์แล้วเลือกค่าที่มากกว่า ทำงานกับ numeric, date และ text columns โดย scan ทุก row ที่ผ่าน filter แล้วเลือกค่าสูงสุด เหมาะสำหรับ measures และ calculated columns (ต้อง wrap ด้วย CALCULATE)
MAXA คืนค่ามากสุดโดยตีความ TRUE=1, FALSE/BLANK=0 และข้ามข้อความที่ไม่ใช่ตัวเลข ใช้กับคอลัมน์ที่มีทั้งตัวเลขและค่าตรรกะเพื่อประเมินค่ามากสุดอย่างสอดคล้อง
MAXX ประเมินนิพจน์สำหรับทุกแถวของตาราง แล้วคืนค่าที่มากที่สุด เหมาะกับการหาค่าสูงสุดจากค่าที่คำนวณต่อแถว ไม่ใช่แค่การสรุปคอลัมน์โดยตรง
MINA คืนค่าน้อยสุดโดยพิจารณา TRUE เป็น 1, FALSE/BLANK เป็น 0 และข้ามข้อความที่ไม่ใช่ตัวเลข ใช้กับคอลัมน์ที่มีตัวเลขและค่าตรรกะปนกันเพื่อหาค่าน้อยสุดอย่างมีบริบท
MINX ประเมินนิพจน์สำหรับทุกแถวของตาราง แล้วคืนค่าที่น้อยที่สุด ต่างจาก MIN ที่ใช้กับคอลัมน์โดยตรง MINX เหมาะกับการหาค่าต่ำสุดจากค่าที่คำนวณต่อแถว เช่น (Quantity × UnitPrice)
PRODUCT คูณค่าทั้งหมดในคอลัมน์ (ละเว้น BLANK และข้อความ) ใช้เมื่อจำเป็นต้องคูณค่าแบบรวม เช่น คูณอัตราเติบโตหรือสัดส่วนที่ต้องรวมผลคูณ
SUM รวมค่าตัวเลขทั้งหมดจากคอลัมน์เดียวภายใต้ filter context ปัจจุบัน ข้ามค่า BLANK และข้อความ แต่รวมค่า 0 หากต้องรวมจาก expression ให้ใช้ SUMX แทน
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่