---
title: TOPN – คืนตาราง Top N ตามนิพจน์การเรียงลำดับ
url: https://www.thepexcel.com/functions/dax/table-manipulation/topn-dax/
type: function-explainer
program: DAX
syntax: "TOPN(<N_Value>, <Table> [, <OrderBy_Expression> [, [<Order>] [, <OrderBy_Expression> [, [<Order>]]]...]])"
date: 2025-12-13
updated: 2025-12-23
scores:
  popularity: 7
  difficulty: 4
  usefulness: 7
---

# TOPN – คืนตาราง Top N ตามนิพจน์การเรียงลำดับ

> คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดั

## คำอธิบาย

คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดับแยกต่างหากสำหรับแต่ละเกณฑ์

## Syntax

```excel
TOPN(&lt;N_Value&gt;, &lt;Table&gt; [, &lt;OrderBy_Expression&gt; [, [&lt;Order&gt;] [, &lt;OrderBy_Expression&gt; [, [&lt;Order&gt;]]]...]])
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| N_Value | Yes | Integer |  | จำนวนแถวที่ต้องการคืน (scalar value) ถ้าเกินจำนวนแถวจริงจะคืนเท่าที่มี ถ้าค่านี้ ≤ 0 จะคืนตารางว่าง |
| Table | Yes | Table |  | ตารางต้นทางที่ต้องการเลือก Top N (อาจเป็นผลจาก VALUES, SUMMARIZE, หรือตารางในโมเดล) |
| OrderBy_Expression | No | Expression | หากไม่ระบุ TOPN จะไม่เรียงลำดับ | นิพจน์สำหรับจัดลำดับแถว (ประเมินในrow context ของตาราง) สามารถระบุได้หลายตัวเพื่อทำ secondary/tertiary sort |
| Order | No | Integer or Boolean | 0 (DESC) | ทิศทางการเรียง: 0 หรือ FALSE = DESC (มากไปน้อย), 1 หรือ TRUE = ASC (น้อยไปมาก). ต้องระบุหลังจากแต่ละ OrderBy_Expression |

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

### ทำ Top N ลูกค้า/สินค้า

เลือกเฉพาะ N รายการที่มีค่ามากที่สุดตามเมเชอร์ เช่น ยอดขาย/กำไร

_เหมาะกับ:_ top-n-ranking

### ใช้เป็นตารางตัวกรองใน CALCULATE

ส่งตาราง Top N เข้าไปเป็นตัวกรองเพื่อคำนวณยอดรวมเฉพาะ Top N

_เหมาะกับ:_ top-n-filter-table

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: Top 5 สินค้าตามยอดขาย (Basic Ranking)

```excel
Top 5 Products by Sales =
TOPN(
    5,
    VALUES(Product[ProductName]),
    [Total Sales],
    0
)
```

**ผลลัพธ์:** `ตาราง 5 สินค้าที่มียอดขายสูงสุด เรียงจากมากไปน้อย`

TOPN(5,...) ขอแถว 5 แถว ลำดับแรก, VALUES(Product[ProductName]) = แต่ละสินค้า, [Total Sales] = เกณฑ์เรียง, 0 = DESC

### 2. ตัวอย่างที่ 2: Top 3 ประเทศ + Secondary Sort (Stable Ranking)

```excel
Top 3 Countries Stable =
TOPN(
    3,
    VALUES(Customer[Country]),
    [Total Revenue], 0,
    Customer[Country], 1
)
```

**ผลลัพธ์:** `3 ประเทศที่มีรายได้สูงสุด หากมี tie จะเรียงชื่อประเทศเพื่อให้ลำดับแน่นอน`

Secondary sort (Country ASC) ป้องกัน 'tie breaker' ที่ไม่เสถียร เมื่อ Revenue เท่ากัน

### 3. ตัวอย่างที่ 3: ยอดขาย Top 10 ประเทศ (CALCULATE + KEEPFILTERS)

```excel
Sales Top 10 Countries =
VAR TopCountries =
    TOPN(
        10,
        VALUES(Customer[Country]),
        [Total Sales],
        0
    )
RETURN
    CALCULATE(
        [Total Sales],
        KEEPFILTERS(TopCountries)
    )
```

**ผลลัพธ์:** `ยอดขายรวมของเฉพาะ 10 ประเทศที่ยอดขายสูงสุด`

TOPN คืนตาราง 10 ประเทศ → KEEPFILTERS ส่งผ่านแต่ละประเทศเป็นตัวกรอง → CALCULATE รวมขายในแต่ละประเทศ

### 4. ตัวอย่างที่ 4: Top N Dynamic ใช้ Slicer Parameter

```excel
Dynamic Top N Sales =
VAR TopCount = [Selected Top N]  // Measure จาก Slicer
RETURN
    CALCULATE(
        [Total Sales],
        KEEPFILTERS(
            TOPN(
                TopCount,
                SUMMARIZE(Product, Product[Category], "CatSales", [Total Sales]),
                [CatSales],
                0
            )
        )
    )
```

**ผลลัพธ์:** `ยอดขายของ Top N หมวดหมู่ โดย N สามารถเปลี่ยนจากปุ่ม/Slicer ได้`

ใช้ VAR เก็บจำนวนที่ผู้ใช้เลือก SUMMARIZE สร้างแถวหมวดหมู่พร้อมยอดขาย TOPN เลือก Top N หมวด

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

- TOPN คืนค่าเป็นตาราง ที่มักใช้กับ CALCULATE + KEEPFILTERS เพื่อทำ Top N dynamic filtering

- หากต้องการ Top N แถวแต่เก็บเฉพาะคอลัมน์บางตัว ลอง TOPN เข้ากับ SELECTCOLUMNS

- ใช้ VAR เพื่อเก็บผลลัพธ์ TOPN แล้วนำไปใช้หลายครั้ง ประหยัดเวลาประเมิน

- สำหรับ Top N per Group (เช่น Top 5 สินค้าต่อหมวด) ลอง TOPNSKIP หรือ Window Functions แทน

- TOPN ไม่รับประกันลำดับในชุดผลลัพธ์ final - ผลลัพธ์อาจไม่เรียง เลยต้อง SORT ตามด้วย

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

**Q: ถ้าไม่ระบุ OrderExpr จะเกิดอะไรขึ้น?**

หากไม่ระบุ OrderExpr TOPN จะไม่เรียงลำดับและคืนแถวแรก N แถวของตารางในลำดับดั้งเดิม ใช้อย่างระมัดระวัง เพราะผลลัพธ์อาจไม่คาดคะเน

**Q: ทำไมบางครั้งได้มากกว่า N แถวกลับมา?**

เพราะ TOPN ประเมินค่า OrderBy_Expression แล้วคืน "ทุกแถวที่มีค่า N-th" หากมี tie (เช่น 5 แถวมียอดขาย = 1000) TOPN จะคืนแถวทั้ง 5 แม้ว่าคุณขอเพียง 3 แถว ให้เพิ่ม secondary sort เพื่อตัด tie

**Q: TOPN vs RANKX ต่างกันยังไง?**

RANKX ให้เลขที่ (1, 2, 3...) ในแต่ละแถว; TOPN คืนตารางแถวอันดับต้น N ตัว ถ้าต้องการจำนวนอันดับ ใช้ RANKX; ถ้าต้องการตัวแถวเอง ใช้ TOPN

**Q: สามารถใช้ TOPN กับ measure ที่เป็น virtual column ได้ไหม?**

ได้ เพราะ OrderBy_Expression ประเมินใน row context ของตาราง เช่น [Profit Margin] = [Sales] / [Cost] แล้ว TOPN เรียงตาม Profit Margin ได้

**Q: TOPN ทำงานใน DirectQuery mode ได้ไหม?**

TOPN รองรับ DirectQuery แต่มีข้อจำกัด: ไม่รองรับในคอลัมน์ที่คำนวณและกฎ RLS บางตัว; ถ้ามีปัญหา ให้ทดสอบกับ Direct Query mode

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

- [Microsoft Learn: TOPN Function](https://learn.microsoft.com/en-us/dax/topn-function-dax) _(official)_
- [DAX Guide: TOPN](https://dax.guide/topn/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/table-manipulation/topn-dax/](https://www.thepexcel.com/functions/dax/table-manipulation/topn-dax/)_
