MIN คืนค่าน้อยที่สุดจากคอลัมน์ภายใต้ filter context ปัจจุบัน หรือเปรียบเทียบสองค่า scalar expression แล้วคืนค่าที่น้อยกว่า รองรับตัวเลข วันที่ และข้อความ ทำงานภายใต้ filter context ทำให้ค่าที่หาได้จะถูกกรองตาม slicer หรือ visual filter อัตโนมัติ เหมาะกับการหาราคาต่ำสุด วันที่เร็วที่สุด หรือการตั้งเพดาน (cap) ให้กับค่าคำนวณ
=MIN(<column>)
=MIN(<column>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| column | column | Yes | คอลัมน์ที่ต้องการหาค่าน้อยที่สุด รองรับตัวเลข วันที่ หรือข้อความ ทำงานภายใต้ filter context ปัจจุบัน และข้ามค่า BLANK ไป ถ้าใช้รูปแบบนี้ไม่ต้องระบุ expression1 และ expression2 | |
| expression1 | scalar | Optional | ไม่มี (ใช้รูปแบบ column เดียว) | ค่า scalar expression ตัวแรกสำหรับการเปรียบเทียบ (ใช้เมื่อเรียก MIN แบบ 2 arguments) อาจเป็น measure, ค่าคงที่ หรือ expression ที่คืนค่าเดียว ถ้าค่านี้เป็น BLANK ผลลัพธ์จะเป็น BLANK |
| expression2 | scalar | Optional | ไม่มี (ใช้รูปแบบ column เดียว) | ค่า scalar expression ตัวที่สองสำหรับการเปรียบเทียบ (ใช้เมื่อเรียก MIN แบบ 2 arguments) อาจเป็น measure, ค่าคงที่ หรือ expression ที่คืนค่าเดียว ถ้าค่านี้เป็น BLANK ผลลัพธ์จะเป็น BLANK |
หาราคาต่ำสุด วันที่เร็วที่สุด หรือค่าต่ำสุดของข้อมูลที่อยู่ในบริบทปัจจุบัน ใช้ใน measure และ visual
จำกัดค่า measure ไม่ให้สูงเกินค่าที่กำหนด เช่น discount rate ไม่เกิน 30% หรือ commission rate ไม่เกิน 15%
เลือกค่าที่น้อยกว่าระหว่างสอง measure เช่น เปรียบเทียบ actual กับ budget แล้วเลือกค่าที่ต่ำกว่า
หา first order date หรือ earliest transaction date ในช่วงที่กรอง ใช้กับ time intelligence analysis
Lowest Price = MIN(Products[Price])Lowest Price = MIN(Products[Price])
คืนราคาต่ำสุดของสินค้าทั้งหมดที่อยู่ใน filter context ปัจจุบัน
First Order Date = MIN(Sales[OrderDate])First Order Date = MIN(Sales[OrderDate])
คืนวันที่ order เร็วที่สุดของแต่ละลูกค้าใน visual
Capped Discount Rate = VAR ActualDiscount = DIVIDE(SUM(Sales[DiscountAmount]), SUM(Sales[SalesAmount]), 0) RETURN MIN(ActualDiscount, 0.30)Capped Discount Rate =
VAR ActualDiscount = DIVIDE(SUM(Sales[DiscountAmount]), SUM(Sales[SalesAmount]), 0)
RETURN
MIN(ActualDiscount, 0.30)
คืน discount rate จริง แต่ถ้าเกิน 30% จะคืน 0.30
Lower of Budget vs Actual = VAR TotalBudget = SUM(Budget[BudgetAmount]) VAR TotalActual = SUM(Sales[SalesAmount]) VAR LowerValue = MIN(TotalBudget, TotalActual)…Lower of Budget vs Actual =
VAR TotalBudget = SUM(Budget[BudgetAmount])
VAR TotalActual = SUM(Sales[SalesAmount])
VAR LowerValue = MIN(TotalBudget, TotalActual)
RETURN
LowerValue
คืนค่าที่ต่ำกว่าระหว่าง budget กับ actual sales
Min Price in Category = CALCULATE( MIN(Products[Price]), ALLEXCEPT(Products, Products[Category]) )Min Price in Category =
CALCULATE(
MIN(Products[Price]),
ALLEXCEPT(Products, Products[Category])
)
แต่ละ row แสดงราคาต่ำสุดในหมวดสินค้าเดียวกันกับ row นั้น
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 เป็น 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 กับข้อความมักไม่มีความหมายทางธุรกิจมากนัก ส่วนใหญ่ใช้กับตัวเลขและวันที่