---
title: TOPNSKIP – ดึงแถวแบบเลื่อนหน้าอย่างมีประสิทธิภาพ
url: https://www.thepexcel.com/functions/dax/table-manipulation/topnskip-dax/
type: function-explainer
program: DAX
syntax: "TOPNSKIP(<Rows>, <Skip>, <Table> [, <OrderExpr> [, [<Order>] [, <OrderExpr> [, [<Order>]]]]])"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 5
  usefulness: 5
---

# TOPNSKIP – ดึงแถวแบบเลื่อนหน้าอย่างมีประสิทธิภาพ

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

## คำอธิบาย

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

## Syntax

```excel
TOPNSKIP(&lt;Rows&gt;, &lt;Skip&gt;, &lt;Table&gt; [, &lt;OrderExpr&gt; [, [&lt;Order&gt;] [, &lt;OrderExpr&gt; [, [&lt;Order&gt;]]]]])
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| Rows | Yes | integer |  | จำนวนแถวที่ต้องการคืน (ต้องเป็นจำนวนเต็มบวก) |
| Skip | Yes | integer |  | จำนวนแถวที่ต้องการข้ามก่อนเริ่มคืนผลลัพธ์ (0 สำหรับไม่ข้าม, 0+ สำหรับการเลื่อนหน้า) |
| Table | Yes | table |  | ตารางต้นทางที่ต้องการดึงแถวจาก (ต้องใช้ physical columns, ไม่ใช่ CALCULATE expressions เมื่อใช้ Skip) |
| OrderExpr | No | expression |  | นิพจน์สำหรับจัดลำดับแถวก่อนทำการ skip (สำคัญมาก สำหรับความเสถียร) ใส่ได้หลายตัว |
| Order | No | keyword |  | ทิศทางการเรียง ASC (น้อยไปมาก) หรือ DESC (มากไปน้อย) ค่าเริ่มต้นคือ DESC |

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

### เลื่อนหน้ารายการ (pagination) ในตารางผลลัพธ์

ต้องการแสดงผลทีละหน้า เช่น หน้าแรก 20 แถว, หน้าที่สอง 20 แถวถัดไป

_เหมาะกับ:_ pagination

### ทำรายงานแบบจัดอันดับแล้วเลื่อนไปดูช่วงถัดไป

เลือกช่วงอันดับ 1-20, 21-40, ... ด้วยการกำหนด Skip

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

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: Pagination ขั้นพื้นฐาน - หน้า 2 (แถว 21-40)

```excel
Page_2_Customers =
TOPNSKIP(
    20,           -- แสดง 20 แถว
    20,           -- ข้าม 20 แถวแรก
    VALUES('Customer'[CustomerID]),
    [Total Sales],
    DESC          -- ลดำดับจากยอดขายมากไปน้อย
)
```

**ผลลัพธ์:** `ตารางที่มี 20 แถวที่อยู่ในลำดับที่ 21-40 เมื่อเรียงตามยอดขาย`

Rows=20 ให้ 20 แถว, Skip=20 ข้าม 20 แถวแรก = ได้หน้า 2 ของชุดข้อมูล

### 2. ตัวอย่างที่ 2: Pagination พร้อมคีย์รองเพื่อความเสถียร

```excel
Page_3_Stable =
VAR RowsPerPage = 10
VAR CurrentPage = 3
RETURN
  TOPNSKIP(
      RowsPerPage,
      (CurrentPage - 1) * RowsPerPage,  -- Skip = (Page-1) * 10
      VALUES('Product'[ProductID]),
      [Revenue], DESC,
      'Product'[ProductName], ASC  -- รองรับเมื่อ Revenue เท่ากัน
  )
```

**ผลลัพธ์:** `แถวที่อยู่ในตำแหน่ง 21-30 ที่เรียงได้อย่างเสถียร`

ใช้ VAR เพื่อทำให้ pagination formula ชัดเจนขึ้น และมี secondary sort เพื่อป้องกันการเปลี่ยนแปลงลำดับเมื่อค่าเท่ากัน

### 3. ตัวอย่างที่ 3: ใช้ TOPNSKIP ผลลัพธ์กับ CALCULATE

```excel
Revenue_Range_21_30 =
VAR TopCustomers = 
  TOPNSKIP(
      10,
      20,
      ALL('Customer'),
      [Total Sales],
      DESC
  )
RETURN
  CALCULATE(
      [Total Sales],
      TopCustomers
  )
```

**ผลลัพธ์:** `ยอดรวมของกลุ่มผู้ซื้อในตำแหน่ง 21-30`

TOPNSKIP คืนตาราง (20 rows มาจาก skip, 10 rows จาก rows parameter) แล้วส่งเป็นตัวกรองให้ CALCULATE คำนวณยอดขายใหม่บนกลุ่มที่ได้

### 4. ตัวอย่างที่ 4: Top 5 ด้วย TOPNSKIP (Skip=0)

```excel
Top_5_Countries =
TOPNSKIP(
    5,        -- เอา 5 แถว
    0,        -- ไม่ข้ามแถว (หน้า 1)
    VALUES('Geography'[Country]),
    [Sales Amount],
    DESC
)
```

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

Skip=0 ใช้ได้เมื่อต้องการแค่หน้าแรก (ฟังก์ชันจะทำงานเหมือน TOPN บ้าง)

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

- ผมแนะนำให้ใช้ VAR เพื่อคำนวณ Skip value ตัวอย่าง VAR SkipRows = (CurrentPage - 1) * RowsPerPage ทำให้ formula ชัดและ debug ง่าย

- สำคัญ: ระบุ secondary sort (OrderExpr ตัวที่สอง) เมื่อค่าหลักอาจเท่ากัน เช่น Revenue เท่า ให้เรียงเพิ่มเติมด้วย CustomerName ป้องกันลำดับวุ่นวาย

- ถ้าใช้ Skip > 0 ต้องเป็นตัวเลขคงที่หรือ VAR ไม่ใช่ Measure dynamic (เพราะเหตุผล performance) และเลี่ยง CALCULATE() เมื่อทำ Skip

- TOPNSKIP แตกต่างจาก TOPN ที่มัน "ไม่รับประกัน" ลำดับของ output - ผลลัพธ์อาจไม่เรียงตามที่ OrderExpr บอก ตัวเลขที่ออกมามาจากลำดับที่ถูกต้อง แต่ตำแหน่งในตารางอาจไม่เรียง

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

**Q: TOPNSKIP กับ TOPN ต่างกันอย่างไร?**

TOPNSKIP มีพารามิเตอร์ Skip เพิ่มเติม ทำให้ใช้ได้สำหรับ pagination โดยตรง และมีประสิทธิภาพสูงกว่าสำหรับงาน paging บน Power BI Dashboard ขอบต่อ ส่วน TOPN ยืดหยุ่นกว่าสำหรับการค้นหาหลายมิติ ผมใช้ TOPNSKIP เมื่อรู้แน่ว่าต้อง fix "เลขหน้า" แล้วแค่เปลี่ยน skip

**Q: ทำไม Skip หรือ Rows ที่เป็น 0 ได้ผล?**

ถ้า Rows = 0 ได้ตารางว่าง ถ้า Skip = 0 ฟังก์ชันจะเริ่มจากแถวแรก (ไม่ข้าม) ทั้งสองกรณีถูกต้องแต่เวลา Skip > 0 ที่ต้องระวัง เพราะต้องอาศัย OrderExpr ที่ชัดเจน มิฉะนั้นลำดับจะไม่เสถียร

**Q: ทำไมต้องใส่ OrderExpr ให้ชัดเจนเวลาใช้ Skip?**

เพราะการข้ามแถว (Skip) ต้องอาศัยลำดับที่แน่นอนและเสถียร ถ้าไม่กำหนด OrderExpr ลำดับอาจแตกต่างไปในการ refresh ใหม่ หรือเมื่อข้อมูลเปลี่ยน ผมมักเตือนว่า "ลำดับไม่ชัด = skip ไม่น่าเชื่อ"

**Q: TOPNSKIP ใช้ได้กับตารางอะไร?**

ใช้ได้กับตาราง physical columns โดยเฉพาะเมื่อ Skip > 0 ถ้า Skip = 0 ส่วนใหญ่ใช้ได้กับ CALCULATE() results แต่เพื่อความปลอดภัย และเสถียร ให้เอา VALUES() หรือ ALL() ของ columns ที่มี primary keys จะดีที่สุด

**Q: OrderExpr ต้องเป็น Measure หรือ Column ได้?**

ได้ทั้งสองแบบ ส่วนใหญ่ใช้ Measure (เช่น [Total Sales]) เพราะต้องการเรียง "ความเจริงของข้อมูล" แต่ Column ก็ได้ เช่น 'Product'[ProductName] ผมใช้ Measure เป็นหลักเพราะมัน stable และสะท้อนความเป็นจริง

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

- topn
- summarizecolumns
- values
- calculate
- keepfilters
- rankx
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)

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

- [DAX.guide - TOPNSKIP](https://dax.guide/topnskip/) _(guide)_
- [Microsoft Learn - TOPNSKIP Function](https://learn.microsoft.com/en-us/dax/topnskip) _(official)_

---

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