ORDERBY ระบุลำดับการเรียงลำดับ (ASC/DESC) และการจัดการค่าว่าง สำหรับ window functions เช่น INDEX, OFFSET, WINDOW เพื่อกำหนดลำดับของแถวภายในกลุ่ม
=ORDERBY(<orderBy_expression>[, <order>][, <orderBy_expression>[, <order>]] ...)
=ORDERBY(<orderBy_expression>[, <order>][, <orderBy_expression>[, <order>]] ...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| orderBy_expression | scalar expression | Optional | (ว่าง) | นิพจน์หรือคอลัมน์ที่ใช้เป็นเกณฑ์เรียงลำดับ เช่น Sales[OrderDate], Measure[Total Sales] สามารถมีหลายตัวได้ (คีย์หลัก รองลำดับ ลำดับสาม ฯลฯ) |
| order | two-part value | Optional | ASC (BLANKS DEFAULT) | ทิศทางการเรียง + การจัดการค่าว่าง ตัวอย่าง: ASC, DESC, ASC BLANKS FIRST, DESC BLANKS LAST เป็นต้น |
ใช้ ORDERBY กับ OFFSET เพื่อเลื่อนตำแหน่งตามลำดับที่กำหนด
ใช้ ORDERBY กับ INDEX เพื่อดึงตำแหน่งคงที่ตามลำดับ
Previous Sales = SUMX( OFFSET( -1, SUMMARIZECOLUMNS(Date[CalendarDate], "Sales", [Total Sales]), ORDERBY([Sales], DESC) ), [Sales] )Previous Sales = SUMX(
OFFSET(
-1,
SUMMARIZECOLUMNS(Date[CalendarDate], "Sales", [Total Sales]),
ORDERBY([Sales], DESC)
),
[Sales]
)
คืนค่ายอดขายของวันที่มียอดขายสูงเป็นอันดับสอง (ออฟเซตขึ้นไปทีละ 1 แถว)
Top 1 Product = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Product[ProductName], "Sales", [Total Sales]), ORDERBY([Sales], DESC) ), [ProductName] )Top 1 Product = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Product[ProductName], "Sales", [Total Sales]),
ORDERBY([Sales], DESC)
),
[ProductName]
)
คืนชื่อสินค้าที่มียอดขายสูงสุด
Multi-Key Sort = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Sales[OrderDate], Sales[OrderID], "Amount", [Total Sales]), ORDERBY( Sales[OrderDate], ASC, Sales[OrderID], DE…Multi-Key Sort = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Sales[OrderDate], Sales[OrderID], "Amount", [Total Sales]),
ORDERBY(
Sales[OrderDate], ASC,
Sales[OrderID], DESC
)
),
[OrderID]
)
คืน OrderID ของออเดอร์ที่เร็วที่สุด และเมื่อมีวันที่เดียวกันก็ลำดับจากออเดอร์ ID สูงลงมา
Sorted with Blanks Last = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Dim[Category], "Sales", [Total Sales]), ORDERBY([Sales], DESC BLANKS LAST) ), [Category] )Sorted with Blanks Last = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Dim[Category], "Sales", [Total Sales]),
ORDERBY([Sales], DESC BLANKS LAST)
),
[Category]
)
คืนประเภทสินค้าที่มียอดขายสูงสุด และสินค้าที่ไม่มีประเภท (NULL) จะอยู่ท้ายสุด
ไม่ได้ครับ ORDERBY ไม่คืนค่า มันเป็น “ส่วนประกอบ” ของ window functions เท่านั้น ถ้าคุณพยายามใช้ ORDERBY เดี่ยว DAX จะขึ้น error ว่า “This function can only be used within a window function expression” ORDERBY ต้องอยู่ภายใน INDEX, OFFSET, WINDOW, MATCHBY, PARTITIONBY เท่านั้น
สำหรับ **ตัวเลข** แล้ว BLANKS DEFAULT วางค่าว่างระหว่างศูนย์กับลบ (ASC: -5, -3, [blank], 0, 2, 5 | DESC: 5, 2, 0, [blank], -3, -5) แต่ BLANKS FIRST บังคับค่าว่างอยู่หน้าสุดเสมอ (ASC: [blank], -5, -3, 0, 2, 5 | DESC: [blank], 5, 2, 0, -3, -5) สำหรับ **ข้อความ** แล้ว BLANKS DEFAULT วางค่าว่างก่อนสตริงทั้งหมด ซึ่งเหมือน BLANKS FIRST
เพิ่มคีย์รอง (secondary key) ใน ORDERBY เพื่อให้แถวแต่ละแถวมีลำดับไม่กำกวม เช่นถ้า ORDERBY(Amount, DESC) มี Amount ซ้ำจำนวนมาก ให้เพิ่ม ORDERBY(Amount, DESC, Date, ASC) หรือใช้ MATCHBY ระบุคีย์ที่ unique (ตัวตนที่ไม่ซ้ำ) เพื่อให้ DAX รู้ว่าแถวไหนคือแถวไหน
ไม่บังคับ แต่ถ้าไม่ใส่ ORDERBY แล้ว index หรือ offset อาจให้ผลลัพธ์ที่ไม่คาดการณ์หรือลอยไปมา เพราะแถวไม่มีลำดับที่กำหนด ผมแนะนำให้ใส่ ORDERBY เพื่อให้ผลลัพธ์นิ่งขึ้น
ORDERBY เป็นฟังก์ชันที่ใช้ “เดี่ยว” ในกลุ่ม Window Functions เท่านั้น โดยทำหน้าที่บอก INDEX, OFFSET, WINDOW, และ MATCHBY ว่า “เรียงลำดับแถวตามอันไหนก่อน” ใช้ได้หลายคีย์ และสามารถควบคุมทิศทาง (ASC/DESC) รวมถึงจัดการค่าว่างได้ (BLANKS FIRST/DEFAULT/LAST)
ที่เจ๋งคือ ORDERBY มีพลัง BLANK HANDLING ที่ละเอียด สำหรับตัวเลขแล้ว DEFAULT วางค่าว่างระหว่างศูนย์กับลบ แต่สำหรับข้อความแล้ว DEFAULT วางค่าว่างก่อนสตริงทั้งหมด และ BLANKS FIRST/LAST บังคับให้ค่าว่างอยู่ที่ตำแหน่งระบุ ไม่ว่าจะเรียงขึ้นหรือลงก็ตาม
ส่วนตัวผมถือว่า ORDERBY คือ “กระดูกสันหลัง” ของ window functions ถ้าคุณไม่ระบุ ORDERBY หรือ ORDERBY ลำดับไม่ชัดเจน ผลลัพธ์จะลอยไปมาหรือไม่คาดการณ์ได้ ผมแนะนำให้ ORDERBY มีคีย์เพียงพอทำให้แถวแต่ละแถวมีลำดับไม่กำกวม