---
title: ORDERBY – กำหนดลำดับการเรียงในฟังก์ชัน Window
url: https://www.thepexcel.com/functions/dax/filter/orderby-dax/
type: function-explainer
program: DAX
syntax: "ORDERBY(<orderBy_expression>[, <order>][, <orderBy_expression>[, <order>]] ...)"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 4
  usefulness: 5
---

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

> ORDERBY ระบุลำดับการเรียงลำดับ (ASC/DESC) และการจัดการค่าว่าง สำหรับ window functions เช่น INDEX, OF

## คำอธิบาย

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

## Syntax

```excel
ORDERBY(&lt;orderBy_expression&gt;[, &lt;order&gt;][, &lt;orderBy_expression&gt;[, &lt;order&gt;]] ...)
```

**Variant**

```excel
ORDERBY(&lt;Expression&gt;, ASC)
```

เรียงจากน้อยไปมาก

**Variant**

```excel
ORDERBY(&lt;Expression1&gt;, DESC, &lt;Expression2&gt;, ASC)
```

เรียงหลายคีย์ (คีย์แรกมากไปน้อย แล้วคีย์ถัดไปน้อยไปมาก)

## Arguments

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

## เคสการใช้งาน

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

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

_เหมาะกับ:_ offset-by-order

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

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

_เหมาะกับ:_ index-by-order

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ดึงยอดขายของแถวก่อนหน้า (OFFSET + ORDERBY DESC)

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

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

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

### 2. ตัวอย่างที่ 2: ใช้ INDEX เลือกแถวอันดับ 1 ตามยอดขาย DESC

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

**ผลลัพธ์:** `คืนชื่อสินค้าที่มียอดขายสูงสุด`

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

### 3. ตัวอย่างที่ 3: เรียงหลายคีย์ (วันที่ + ยอดขาย)

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

**ผลลัพธ์:** `คืน OrderID ของออเดอร์ที่เร็วที่สุด และเมื่อมีวันที่เดียวกันก็ลำดับจากออเดอร์ ID สูงลงมา`

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

### 4. ตัวอย่างที่ 4: ควบคุมค่าว่าง (BLANKS LAST)

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

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

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

## หมายเหตุเพิ่มเติม

- ผมแนะนำให้ ORDERBY มีคีย์เพียงพอทำให้ลำดับไม่กำกวม ถ้าผลลัพธ์ลอยไปมา ก็เสริมคีย์รอง เลือก BLANKS FIRST/DEFAULT/LAST ตามความเหมาะสม ไม่ใช่เลือกแบบสุ่ม

- ส่วนตัวผมมักใช้ BLANKS LAST เมื่อเรียง DESC (มากไปน้อย) และ BLANKS FIRST/DEFAULT เมื่อเรียง ASC เพื่อให้ค่าว่างไม่รบกวนอันดับ

- ถ้าใช้ OFFSET หรือ INDEX แล้วได้ error เรื่อง row context หรือ filter context ให้ตรวจว่า ORDERBY ถูกวางภายในฟังก์ชัน window ที่ถูกต้องไหม บางทีอาจต้อง MATCHBY เพื่อระบุตัวตนแถวให้ชัดเจน

## คำถามที่พบบ่อย

**Q: 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 เท่านั้น

**Q: 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

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

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

**Q: Window functions (INDEX, OFFSET, ...) ต้องมี ORDERBY ทุกครั้งหรือ?**

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

## ฟังก์ชันที่เกี่ยวข้อง

- offset-dax
- [INDEX – ดึงแถวตามตำแหน่งภายในเพาร์ติชัน](https://www.thepexcel.com/functions/dax/filter/index-dax/)
- window
- partitionby
- matchby
- summarizecolumns
- minx

## แหล่งข้อมูลเพิ่มเติม

- [Microsoft Learn: ORDERBY Function](https://learn.microsoft.com/en-us/dax/orderby-function-dax) _(official)_
- [DAX Guide: ORDERBY](https://dax.guide/orderby/) _(guide)_
- [Microsoft Learn: OFFSET Function (uses ORDERBY)](https://learn.microsoft.com/en-us/dax/offset-function-dax) _(official)_
- [Microsoft Learn: INDEX Function (uses ORDERBY)](https://learn.microsoft.com/en-us/dax/index-function-dax) _(official)_

---

_Source: [https://www.thepexcel.com/functions/dax/filter/orderby-dax/](https://www.thepexcel.com/functions/dax/filter/orderby-dax/)_
