Thep Excel

ORDERBYกำหนดลำดับการเรียงในฟังก์ชัน Window

ORDERBY ระบุลำดับการเรียงลำดับ (ASC/DESC) และการจัดการค่าว่าง สำหรับ window functions เช่น INDEX, OFFSET, WINDOW เพื่อกำหนดลำดับของแถวภายในกลุ่ม

fx
=ORDERBY(<orderBy_expression>[, <order>][, <orderBy_expression>[, <order>]] …)

ความนิยม5/10
ความยาก4/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
[orderBy_expression]ไม่บังคับ scalar expression (ว่าง) นิพจน์หรือคอลัมน์ที่ใช้เป็นเกณฑ์เรียงลำดับ เช่น Sales[OrderDate], Measure[Total Sales] สามารถมีหลายตัวได้ (คีย์หลัก รองลำดับ ลำดับสาม ฯลฯ)
[order]ไม่บังคับ two-part value ASC (BLANKS DEFAULT) ทิศทางการเรียง + การจัดการค่าว่าง ตัวอย่าง: ASC, DESC, ASC BLANKS FIRST, DESC BLANKS LAST เป็นต้น

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

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 มีคีย์เพียงพอทำให้แถวแต่ละแถวมีลำดับไม่กำกวม

How it works

กำหนดลำดับเพื่อหาแถวก่อนหน้า/ถัดไป

ใช้ ORDERBY กับ OFFSET เพื่อเลื่อนตำแหน่งตามลำดับที่กำหนด

กำหนดลำดับเพื่อดึงอันดับที่ N

ใช้ ORDERBY กับ INDEX เพื่อดึงตำแหน่งคงที่ตามลำดับ

Examples

ตัวอย่างที่ 1: ดึงยอดขายของแถวก่อนหน้า (OFFSET + ORDERBY DESC)Previous Sales = SUMX( OFFSET( -1, SUMMARIZECOLUMNS(Date[CalendarDate], "Sales", [Total Sales]), ORDERBY([Sales], DESC) ), [Sales] )

ORDERBY DESC เรียงลำดับจากมากไปน้อยตามยอดขาย แล้ว OFFSET(-1) เลื่อนขึ้นไปแถวถัดไป ถ้าแถวปัจจุบันเป็นอันดับ 1 ก็ได้อันดับ 2

fx
Previous Sales = SUMX(
OFFSET(
-1,
SUMMARIZECOLUMNS(Date[CalendarDate], "Sales", [Total Sales]),
ORDERBY([Sales], DESC)
),
[Sales]
)

ผลลัพธ์คืนค่ายอดขายของวันที่มียอดขายสูงเป็นอันดับสอง (ออฟเซตขึ้นไปทีละ 1 แถว)
ตัวอย่างที่ 2: ใช้ INDEX เลือกแถวอันดับ 1 ตามยอดขาย DESCTop 1 Product = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Product[ProductName], "Sales", [Total Sales]), ORDERBY([Sales], DESC) ), [ProductName] )

INDEX(1, …, ORDERBY(…, DESC)) เลือกแถวลำดับที่ 1 จากตารางที่เรียงยอดขายจากมากไปน้อย

fx
Top 1 Product = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Product[ProductName], "Sales", [Total Sales]),
ORDERBY([Sales], DESC)
),
[ProductName]
)

ผลลัพธ์คืนชื่อสินค้าที่มียอดขายสูงสุด
ตัวอย่างที่ 3: เรียงหลายคีย์ (วันที่ + ยอดขาย)Multi-Key Sort = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Sales[OrderDate], Sales[OrderID], "Amount", [Total Sales]), ORDERBY( Sales[OrderDate], ASC, Sales[OrderID], DE…

ORDERBY คีย์แรก (Date ASC) หลักกว่า แต่เมื่อวันที่ซ้ำแล้วค่อยมองไปยัง ORDERBY คีย์รอง (OrderID DESC) นี่ทำให้ลำดับไม่กำกวมแม้มีค่าซ้ำ

fx
Multi-Key Sort = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Sales[OrderDate], Sales[OrderID], "Amount", [Total Sales]),
ORDERBY(
Sales[OrderDate], ASC,
Sales[OrderID], DESC
)
),
[OrderID]
)

ผลลัพธ์คืน OrderID ของออเดอร์ที่เร็วที่สุด และเมื่อมีวันที่เดียวกันก็ลำดับจากออเดอร์ ID สูงลงมา
ตัวอย่างที่ 4: ควบคุมค่าว่าง (BLANKS LAST)Sorted with Blanks Last = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Dim[Category], "Sales", [Total Sales]), ORDERBY([Sales], DESC BLANKS LAST) ), [Category] )

BLANKS LAST บังคับให้ค่าว่างอยู่ท้ายสุดไม่ว่า DESC/ASC ตรงข้ามกับ BLANKS DEFAULT ที่วางแตกต่างตามประเภทข้อมูล

fx
Sorted with Blanks Last = MAXX(
INDEX(
1,
SUMMARIZECOLUMNS(Dim[Category], "Sales", [Total Sales]),
ORDERBY([Sales], DESC BLANKS LAST)
),
[Category]
)

ผลลัพธ์คืนประเภทสินค้าที่มียอดขายสูงสุด และสินค้าที่ไม่มีประเภท (NULL) จะอยู่ท้ายสุด

FAQs

ORDERBY ใช้เดี่ยว ๆ ได้ไหม? ถ้าใส่ ORDERBY เป็น measure ล่ะ?+

ไม่ได้ครับ ORDERBY ไม่คืนค่า มันเป็น "ส่วนประกอบ" ของ window functions เท่านั้น ถ้าคุณพยายามใช้ ORDERBY เดี่ยว DAX จะขึ้น error ว่า "This function can only be used within a window function expression" ORDERBY ต้องอยู่ภายใน INDEX, OFFSET, WINDOW, MATCHBY, PARTITIONBY เท่านั้น

ORDERBY ASC BLANKS DEFAULT vs BLANKS FIRST ต่างกันอย่างไร?+

สำหรับ **ตัวเลข** แล้ว 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

ถ้า ORDERBY มีค่าซ้ำเต็ม ๆ (duplicate) ควรทำอย่างไร?+

เพิ่มคีย์รอง (secondary key) ใน ORDERBY เพื่อให้แถวแต่ละแถวมีลำดับไม่กำกวม เช่นถ้า ORDERBY(Amount, DESC) มี Amount ซ้ำจำนวนมาก ให้เพิ่ม ORDERBY(Amount, DESC, Date, ASC) หรือใช้ MATCHBY ระบุคีย์ที่ unique (ตัวตนที่ไม่ซ้ำ) เพื่อให้ DAX รู้ว่าแถวไหนคือแถวไหน

Window functions (INDEX, OFFSET, …) ต้องมี ORDERBY ทุกครั้งหรือ?+

ไม่บังคับ แต่ถ้าไม่ใส่ ORDERBY แล้ว index หรือ offset อาจให้ผลลัพธ์ที่ไม่คาดการณ์หรือลอยไปมา เพราะแถวไม่มีลำดับที่กำหนด ผมแนะนำให้ใส่ ORDERBY เพื่อให้ผลลัพธ์นิ่งขึ้น

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ ORDERBY จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้ORDERBYFilter
Filter (5)
INDEX

INDEX ดึงแถวจากตำแหน่งที่ระบุ (Position) ภายในกลุ่มข้อมูลที่เรียงแล้ว โดยสามารถใช้ ORDERBY และ PARTITIONBY เพื่อควบคุมลำดับและการแบ่งกลุ่ม เหมาะสำหรับงาน window function เช่นดึงค่าอันดับที่ N

LOOKUP

LOOKUP ค้นหาและดึงค่าจากเมทริกซ์ภาพ (visual matrix) ในการคำนวณภาพโดยการระบุเงื่อนไขการกรอง ใช้เฉพาะในการคำนวณภาพเท่านั้น

MATCHBY

MATCHBY ระบุคอลัมน์ที่ใช้จับคู่และระบุแถวปัจจุบันใน window functions เพื่อให้การเลื่อน/เลือกตำแหน่งแถวทำงานถูกต้องเมื่อมีค่า ORDERBY ซ้ำ หรือเมื่อจำเป็นต้องกำหนดเอกลักษณ์ของแถว

PARTITIONBY

PARTITIONBY ระบุคอลัมน์ที่ใช้แบ่งกลุ่มสำหรับ window functions เพื่อให้การเลื่อน/เลือกตำแหน่งเกิดขึ้น “ภายในกลุ่ม” ตามที่กำหนด มักใช้ร่วมกับ ORDERBY และ MATCHBY

WINDOW

WINDOW ดึงช่วงแถวภายในพาร์ทิชัน คืนค่าเป็นตาราง เหมาะกับการคำนวณแบบช่วง เช่น moving average, running sum, หรือ lead/lag analysis

Visual calculations (2)
MOVINGAVERAGE

MOVINGAVERAGE คำนวณค่าเฉลี่ยเคลื่อนที่ (moving average) บนแกนของ Visual Calculations ในตารางข้อมูล เหมาะสำหรับทำเส้นแนวโน้มที่เรียบขึ้นและลดความผันผวนของข้อมูล

RUNNINGSUM

RUNNINGSUM คำนวณยอดสะสมของคอลัมน์/นิพจน์ตามลำดับบนแกนของ Visual Calculations โดยสามารถกำหนด Axis, OrderBy, Blanks และ Reset เพื่อควบคุมลำดับและจุดเริ่มสะสม

Table manipulation (1)
TOPNSKIP

ดึงแถวจากตารางโดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามการเรียงลำดับที่ระบุ มีประสิทธิภาพสูงสำหรับงาน pagination

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่