เทพเอ็กเซล ช่วย "ปลุกเทพ Excel ในตัวคุณ"
0
  • No products in the cart.
DAX Formula

เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX

max-lastdate-dax

เมื่อเราศึกษา DAX ใน Power BI/Excel Power Pivot ไปซักพัก บางทีก็จะเจอหลายฟังก์ชันที่ทำงานคล้ายกันมากๆ เช่น MAX กับ LASTDATE แต่การที่เราจะเข้าใจมันได้อย่างแท้จริงก็คือต้องลองหามุมคิดที่ว่า แต่ละฟังก์ชันที่คล้ายกันนั้น มีจุดเหมือนหรือจุดต่างกันอย่างไร

ป.ล. เว็บ SQLBI เคยเขียนสรุปไว้ในนี้ ผมขอนำมาตีความเพิ่มเติม รวมถึงใส่ภาพประกอบและตัวอย่างให้เพื่อนๆ เข้าใจง่ายขึ้น

โดยที่ช่วงแรกผมจะขอพูดการใช้งานในฐานะ Measure ซะก่อน แล้วอธิบายเวลาเอาไปใช้ใน Calculated Column ทีหลัง เพราะมีพฤติกรรมที่ซับซ้อนเกิดขึ้นกับ LASTDATE ในกรณี Column นะครับ

เอาล่ะมาเริ่มจากฟังก์ชันพื้นฐานอย่างMAX ซะก่อน

MAX แบบพื้นๆ

MAX จะหาค่าสูงสุด โดยให้ผลลัพธ์ออกมาเป็นค่าแบบ Scalar ก็คือเป็น Value ตัวเลขธรรมดาๆ ไปเลย ซึ่งใช้ได้กับ Data Type ได้หลากหลาย

  • หากใช้กับเลขหรือวันที่ก็จะได้ค่ามากสุด (อันนี้ไม่แปลก )
  • หากใช้กับText จะมองตามตัวอักษร A-Z (ซึ่งตรงนี้ไม่เหมือน Excel )
  • แต่ถ้าใช้กับคอลัมน์ที่เป็น Logic จะได้ Error เลย

การใช้ MAX จะใช้ได้ 2 แบบคือ

  • MAX (คอลัมน์) เพื่อให้ได้ค่าสูงสุดในคอลัมน์ที่เลือก
  • MAX ( ค่า1,ค่า2) เพื่อให้ได้ค่าสูงสุดระหว่าง 2 ค่า

LASTDATE แบบพื้นๆ

LASTDATE ( <Dates> ) จะหาค่าวันที่มากสุดของคอลัมน์วันที่ที่กำหนด (แปลว่าใช้ได้กับ Field ที่เป็นวันที่เท่านั้น)

ซึ่ง LASTDATE เป็น Table Function ซึ่งจะให้ผลลัพธ์ออกมาเป็น Table ที่มี 1 Row และ 1 Column

แต่ทว่าใน DAX จะมีกฎพิเศษอยู่ว่า ค่าใดที่เป็น Table ที่มี 1 Row และ 1 Column DAX จะสามารถตีความให้เป็นค่า Scalar ธรรมดาๆ โดยอัตโนมัติได้ด้วย (แต่ในทางกลับกัน คือทำจาก Scalar เป็น Table อัตโนมัติไม่ได้นะ)

แปลว่า MAX ใช้ได้กับข้อมูลที่ต้องการผลลัพธ์เป็น Scalar เท่านั้น แต่ว่า LASTDATE ใช้ได้กับข้อมูลที่ต้องการ Scalar หรือ Table ก็ได้

หากลองทดสอบดูจะเห็นได้ชัดเลย

เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 1

สรุปความรู้ ณ ตอนนี้

MAX

  • หาค่ามากสุดในคอลัมน์ที่กำหนด หรือระหว่างสองค่า
  • ใช้ได้กับคอลัมน์ตัวเลข วันที่ และข้อความ
  • ให้ผลลัพธ์กับ Scalar Value เท่านั้น

LASTDATE

  • หาวันที่มากสุดในคอลัมน์วันที่ที่กำหนด
  • ใช้ได้กับคอลัมน์วันที่อย่างเดียว
  • ให้ผลลัพธ์เป็น Table หรือ Scalar ก็ได้

ต่อไปจะทดสอบกับข้อมูลวันที่ทั้งคู่

ใน Filter Argument ของ CALCULATE ต้องการ input ที่เป็น Table ซึ่งแปลว่าเราใส่ LASTDATE ได้ (เพราะมันให้ผลเป็น Table ได้) ดังนี้

ยอดขายวันสุดท้าย = CALCULATE([ยอดขายรวม],LASTDATE(dDate[Date]))
เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 2

แต่เราไม่สามารถใส่ MAX ในกรณีนี้ได้

ยอดขายวันสุดท้ายMAX = CALCULATE([ยอดขายรวม],MAX(dDate[Date]))
เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 3

แบบนี้ก็ไม่ได้

ยอดขายวันสุดท้ายMAX = CALCULATE (
    [ยอดขายรวม],
    dDate[Date] = MAX ( dDate[Date] )
)
เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 4

ที่ทำแบบนี้ไม่ได้ เพราะ CALCULATE ไม่รองรับการเปรียบเทียบกับค่า Measure หรือ Expression ถ้าจะทำต้องใช้ VAR หรือไม่ก็หลบไปใช้ใน FILTER แทน ดังนี้

ถ้าหลบไปใช้ VAR ให้มันคำนวณ MAX( dDate[Date] ) ให้เป็นค่าคงที่ไปก่อน แล้วค่อยเอาค่าคงที่ไปใช้ในเงื่อนไขเปรียบเทียบ (ซึ่งผมชอบใช้วิธีนี้เพราะสูตรเข้าใจง่ายกว่า)

ยอดขายวันสุดท้ายMAX = 
VAR CurrentMaxDate= MAX( dDate[Date] )
RETURN
CALCULATE (
    [ยอดขายรวม],
    dDate[Date] = CurrentMaxDate
)

หรือถ้าจะใส่ MAX ใน FILTER ก็จะทำได้ เนื่องจาก FILTER รองรับการเปรียบเทียบกับ Measure หรือ Expression ได้ คือต้องใช้ในฐานะที่เป็น Scalar Value เท่านั้น

ยอดขายวันสุดท้ายMAX =
CALCULATE (
    [ยอดขายรวม],
    FILTER ( ALL ( dDate[Date] ), dDate[Date] = MAX ( dDate[Date] ) )
)

และ LASTDATE สามารถรองรับคอลัมน์วันที่ที่เป็นสูตรได้ เช่น ถ้าเขียน LASTDATE ผสมกับ ALL ก็จะไม่มีปัญหาอะไร แต่ถ้าใช้ MAX จะไม่ได้ ดังนี้

วันสุดท้ายLastDate = LASTDATE ( ALL ( 'dDate'[Date] ) )
วันสุดท้ายMAX = MAX ( ALL ( 'dDate'[Date] ) )

ที่ใช้ MAX ไม่ได้ เพราะ MAX ต้องใช้กับคอลัมน์ที่มีอยู่จริงตรงๆ เท่านั้น

เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 5

ดูเหมือนว่าการใช้ LASTDATE จะดีกว่าในเกือบทุกกรณี แต่มีจุดที่ควรต้องระวังตรงที่ LASTDATE หากอยู่ใน Row Context จะทำให้เกิด Context Transition

สิ่งที่หลายคนไม่รู้คือ

LASTDATE ( 'dDate'[Date] )

ภายใน DAX เอง จะตีความเป็นแบบนี้โดยอัตโนมัติ

LASTDATE ( CALCULATETABLE ( DISTINCT ( 'dDate'[Date] ) ) )

ซึ่ง CALCULATETABLE มีพฤติกรรมแบบเดียวกับ CALCULATE คือเมื่อเจอ Row Context จะทำให้เกิด Context Transition ทันที เช่นถ้าไปใช้ในฐานะ Calculated Column ก็จะเห็นผลลัพธ์เลยแบบนี้ (สังเกตว่า LASTDATE ไมได้ค่ามากสุดของตาราง แต่เป็นมากสุดในแต่ละวันที่แทน เพราะมีการเปลี่ยน Row Context เป็น Filter Context)

LastDate = LASTDATE(dDate[Date])
MaxDate = MAX(dDate[Date])
เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 6

จะเห็นวาส LastDate เจอ Context Transition เข้าเล่นงาน ทำให้มองไม่เห็นวันสุดท้ายจริง แต่ MaxDate เห็นวันสุดท้ายของคอลัมน์จริงๆ ดังนั้นถ้าจะใช้ LASTDATE ใน Row Context ต้องระวังจุดนี้ด้วย

สรุปความรู้

MAX

  • หาค่ามากสุดในคอลัมน์ที่กำหนด หรือระหว่างสองค่า
  • ใช้ได้กับคอลัมน์ตัวเลข วันที่ และข้อความ แต่ต้องเป็นคอลัมน์จริงๆ เท่านั้น
  • ให้ผลลัพธ์กับ Scalar Value เท่านั้น

LASTDATE

  • หาวันที่มากสุดในคอลัมน์วันที่ที่กำหนด
  • ใช้ได้กับคอลัมน์วันที่อย่างเดียว แต่สามารถใช้ร่วมกับ Table Function อื่นๆ ที่ให้ผลเป็นวันที่ได้ เช่น ALL
  • ให้ผลลัพธ์เป็น Table หรือ Scalar ก็ได้
  • เวลาใช้ใน Row Context จะเกิด Context Transition เนื่องจากจริงๆ ตัวมันแฝงด้วย CALCULATETABLE อยู่ข้างใน

สารบัญ Series Power BI

ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมีคอร์สออนไลน์ที่สอน Power BI ตั้งแต่พื้นฐาน สามารถไปดูรายละเอียดได้ที่นี่

This image has an empty alt attribute; its file name is Powerful-Data-Power-BI-1024x538.png

แชร์ความรู้ให้เพื่อนๆ ของคุณ
  • 92
  •  
  •  
  •  
  •  
  • 92
  •  
  •  
  •  
  •  
Sira Ekabut
the authorSira Ekabut
• Microsoft Office Specialist : Excel ระดับ Expert • ก่อตั้งเว็บไซต์และ แฟนเพจเทพเอ็กเซล คนติดตาม 8 หมื่นคน+, คลิปวีดีโอ 1 ล้าน Views + • หนังสือ Best Seller คอมพิวเตอร์ : Excel Level Up! , จอมเวท เทพ Excel , Excel Power Up!วิทยากรใน SkillLane.com คอร์สออนไลน์ชั้นนำ / อบรม Excel ให้บริษัทชั้นนำ

Leave a Reply