Thep Excel

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

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

=TOPNSKIP(<Rows>, <Skip>, <Table> [, <OrderExpr> [, [<Order>] [, <OrderExpr> [, [<Order>]]]]])

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
5/10

Difficulty
5/10

Usefulness
5/10

Syntax & Arguments

=TOPNSKIP(<Rows>, <Skip>, <Table> [, <OrderExpr> [, [<Order>] [, <OrderExpr> [, [<Order>]]]]])

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

How it works

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

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

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

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

Examples

ตัวอย่างที่ 1: Pagination ขั้นพื้นฐาน – หน้า 2 (แถว 21-40)
Page_2_Customers = TOPNSKIP( 20, -- แสดง 20 แถว 20, -- ข้าม 20 แถวแรก VALUES('Customer'[CustomerID]), [Total Sales], DESC -- ลดำดับจากยอดขายมากไปน้อย )
Rows=20 ให้ 20 แถว, Skip=20 ข้าม 20 แถวแรก = ได้หน้า 2 ของชุดข้อมูล
DAX Formula:

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

Result:

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

ตัวอย่างที่ 2: Pagination พร้อมคีย์รองเพื่อความเสถียร
Page_3_Stable = VAR RowsPerPage = 10 VAR CurrentPage = 3 RETURN TOPNSKIP( RowsPerPage, (CurrentPage - 1) * RowsPerPage, -- Skip = (Page-1) * 10 VALUES('Product'…
ใช้ VAR เพื่อทำให้ pagination formula ชัดเจนขึ้น และมี secondary sort เพื่อป้องกันการเปลี่ยนแปลงลำดับเมื่อค่าเท่ากัน
DAX Formula:

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 เท่ากัน
  )

Result:

แถวที่อยู่ในตำแหน่ง 21-30 ที่เรียงได้อย่างเสถียร

ตัวอย่างที่ 3: ใช้ TOPNSKIP ผลลัพธ์กับ CALCULATE
Revenue_Range_21_30 = VAR TopCustomers = TOPNSKIP( 10, 20, ALL('Customer'), [Total Sales], DESC ) RETURN CALCULATE( [Total Sales], TopCustomers )
TOPNSKIP คืนตาราง (20 rows มาจาก skip, 10 rows จาก rows parameter) แล้วส่งเป็นตัวกรองให้ CALCULATE คำนวณยอดขายใหม่บนกลุ่มที่ได้
DAX Formula:

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

Result:

ยอดรวมของกลุ่มผู้ซื้อในตำแหน่ง 21-30

ตัวอย่างที่ 4: Top 5 ด้วย TOPNSKIP (Skip=0)
Top_5_Countries = TOPNSKIP( 5, -- เอา 5 แถว 0, -- ไม่ข้ามแถว (หน้า 1) VALUES('Geography'[Country]), [Sales Amount], DESC )
Skip=0 ใช้ได้เมื่อต้องการแค่หน้าแรก (ฟังก์ชันจะทำงานเหมือน TOPN บ้าง)
DAX Formula:

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

Result:

5 ประเทศที่มียอดขายสูงสุด

FAQs

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

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

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

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

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

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

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

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

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

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

Resources & Related

Additional Notes

TOPNSKIP คือฟังก์ชันสำหรับเลื่อนหน้า (pagination) ที่ดึงจำนวนแถวที่ต้องการจากตาราง โดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามลำดับที่ระบุ เหมือนการพูดว่า “ข้ามไป 20 แถว แล้วเอา 10 แถวถัดไป”

ที่เจ๋งคือ TOPNSKIP ดีสำหรับ UI ที่ต้อง scroll หรือ paging เพราะมีประสิทธิภาพสูงกว่า TOPN ในหลายสถานการณ์ มันเหมาะเมื่อคุณ fix เลขหน้าแล้วแค่ต้องเปลี่ยนจำนวนแถวที่ข้าม

ส่วนตัวผมถือว่า TOPNSKIP เป็นเฟรนดของเรา โดยเฉพาะเวลาทำ Power BI report ที่ต้อง support pagination ขอบต่อ และทำไมไม่ใช้ TOPN? เพราะบางอย่างต้องการความเร็วมากกว่าความยืดหยุ่น

Leave a Reply

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