Thep Excel

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

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

=ORDERBY(<orderBy_expression>[, <order>][, <orderBy_expression>[, <order>]] ...)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
5/10

Difficulty
4/10

Usefulness
5/10

Syntax & Arguments

=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 เป็นต้น

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
DAX Formula:

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

Result:

คืนค่ายอดขายของวันที่มียอดขายสูงเป็นอันดับสอง (ออฟเซตขึ้นไปทีละ 1 แถว)

ตัวอย่างที่ 2: ใช้ INDEX เลือกแถวอันดับ 1 ตามยอดขาย DESC
Top 1 Product = MAXX( INDEX( 1, SUMMARIZECOLUMNS(Product[ProductName], "Sales", [Total Sales]), ORDERBY([Sales], DESC) ), [ProductName] )
INDEX(1, …, ORDERBY(…, DESC)) เลือกแถวลำดับที่ 1 จากตารางที่เรียงยอดขายจากมากไปน้อย
DAX Formula:

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

Result:

คืนชื่อสินค้าที่มียอดขายสูงสุด

ตัวอย่างที่ 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) นี่ทำให้ลำดับไม่กำกวมแม้มีค่าซ้ำ
DAX Formula:

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

Result:

คืน 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 ที่วางแตกต่างตามประเภทข้อมูล
DAX Formula:

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

Result:

คืนประเภทสินค้าที่มียอดขายสูงสุด และสินค้าที่ไม่มีประเภท (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

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

Leave a Reply

Your email address will not be published. Required fields are marked *