Thep Excel

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

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

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

ความนิยม5/10
ความยาก5/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

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

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

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

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 ของชุดข้อมูล

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

ผลลัพธ์ตารางที่มี 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 เพื่อป้องกันการเปลี่ยนแปลงลำดับเมื่อค่าเท่ากัน

fx
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 ที่เรียงได้อย่างเสถียร
ตัวอย่างที่ 3: ใช้ TOPNSKIP ผลลัพธ์กับ CALCULATERevenue_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 คำนวณยอดขายใหม่บนกลุ่มที่ได้

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

ผลลัพธ์ยอดรวมของกลุ่มผู้ซื้อในตำแหน่ง 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 บ้าง)

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

ผลลัพธ์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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ TOPNSKIP จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้TOPNSKIPTable manipulation
Table manipulation (4)
SUMMARIZECOLUMNS

SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที

TOPN

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

TOPNPERLEVEL

ฟังก์ชันเชิงเครื่องมือสำหรับเลือกจำนวนแถวสูงสุด (Top N) ต่อ ระดับในโครงสร้างลำดับชั้น (hierarchy) ที่มีการขยาย/ยุบโหนด

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Filter (3)
CALCULATETABLE

CALCULATETABLE evaluate table expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน แล้วคืนค่าเป็น table (ตาราง) ซึ่งแตกต่างจาก CALCULATE ที่คืนค่าเป็น scalar value รองรับ filter arguments 3 รูปแบบ: Boolean expression, table expression, และ filter modifier functions (REMOVEFILTERS, ALL, KEEPFILTERS, USERELATIONSHIP, CROSSFILTER) มีพฤติกรรมเหมือน CALCULATE ในทุกแง่มุมของการจัดการ filter context รวมถึง context transition แต่เหมาะสำหรับการสร้าง intermediate table ที่ถูกกรองแล้วส่งต่อให้ iterator functions หรือใช้ใน calculated table มักมี performance ดีกว่า FILTER ใน simple filtering scenarios เพราะ DAX engine สามารถทำ cardinality estimation และ optimization ได้ดีกว่า

FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

ORDERBY

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

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่