ดึงแถวจากตารางโดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามการเรียงลำดับที่ระบุ มีประสิทธิภาพสูงสำหรับงาน pagination
=TOPNSKIP(<Rows>, <Skip>, <Table> [, <OrderExpr> [, [<Order>] [, <OrderExpr> [, [<Order>]]]]])
=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 |
ต้องการแสดงผลทีละหน้า เช่น หน้าแรก 20 แถว, หน้าที่สอง 20 แถวถัดไป
เลือกช่วงอันดับ 1-20, 21-40, … ด้วยการกำหนด Skip
Page_2_Customers = TOPNSKIP( 20, -- แสดง 20 แถว 20, -- ข้าม 20 แถวแรก VALUES('Customer'[CustomerID]), [Total Sales], DESC -- ลดำดับจากยอดขายมากไปน้อย )Page_2_Customers =
TOPNSKIP(
20, -- แสดง 20 แถว
20, -- ข้าม 20 แถวแรก
VALUES('Customer'[CustomerID]),
[Total Sales],
DESC -- ลดำดับจากยอดขายมากไปน้อย
)
ตารางที่มี 20 แถวที่อยู่ในลำดับที่ 21-40 เมื่อเรียงตามยอดขาย
Page_3_Stable = VAR RowsPerPage = 10 VAR CurrentPage = 3 RETURN TOPNSKIP( RowsPerPage, (CurrentPage - 1) * RowsPerPage, -- Skip = (Page-1) * 10 VALUES('Product'…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 ที่เรียงได้อย่างเสถียร
Revenue_Range_21_30 = VAR TopCustomers = TOPNSKIP( 10, 20, ALL('Customer'), [Total Sales], DESC ) RETURN CALCULATE( [Total Sales], TopCustomers )Revenue_Range_21_30 =
VAR TopCustomers =
TOPNSKIP(
10,
20,
ALL('Customer'),
[Total Sales],
DESC
)
RETURN
CALCULATE(
[Total Sales],
TopCustomers
)
ยอดรวมของกลุ่มผู้ซื้อในตำแหน่ง 21-30
Top_5_Countries = TOPNSKIP( 5, -- เอา 5 แถว 0, -- ไม่ข้ามแถว (หน้า 1) VALUES('Geography'[Country]), [Sales Amount], DESC )Top_5_Countries =
TOPNSKIP(
5, -- เอา 5 แถว
0, -- ไม่ข้ามแถว (หน้า 1)
VALUES('Geography'[Country]),
[Sales Amount],
DESC
)
5 ประเทศที่มียอดขายสูงสุด
TOPNSKIP มีพารามิเตอร์ Skip เพิ่มเติม ทำให้ใช้ได้สำหรับ pagination โดยตรง และมีประสิทธิภาพสูงกว่าสำหรับงาน paging บน Power BI Dashboard ขอบต่อ ส่วน TOPN ยืดหยุ่นกว่าสำหรับการค้นหาหลายมิติ ผมใช้ TOPNSKIP เมื่อรู้แน่ว่าต้อง fix “เลขหน้า” แล้วแค่เปลี่ยน skip
ถ้า Rows = 0 ได้ตารางว่าง ถ้า Skip = 0 ฟังก์ชันจะเริ่มจากแถวแรก (ไม่ข้าม) ทั้งสองกรณีถูกต้องแต่เวลา Skip > 0 ที่ต้องระวัง เพราะต้องอาศัย OrderExpr ที่ชัดเจน มิฉะนั้นลำดับจะไม่เสถียร
เพราะการข้ามแถว (Skip) ต้องอาศัยลำดับที่แน่นอนและเสถียร ถ้าไม่กำหนด OrderExpr ลำดับอาจแตกต่างไปในการ refresh ใหม่ หรือเมื่อข้อมูลเปลี่ยน ผมมักเตือนว่า “ลำดับไม่ชัด = skip ไม่น่าเชื่อ”
ใช้ได้กับตาราง physical columns โดยเฉพาะเมื่อ Skip > 0 ถ้า Skip = 0 ส่วนใหญ่ใช้ได้กับ CALCULATE() results แต่เพื่อความปลอดภัย และเสถียร ให้เอา VALUES() หรือ ALL() ของ columns ที่มี primary keys จะดีที่สุด
ได้ทั้งสองแบบ ส่วนใหญ่ใช้ Measure (เช่น [Total Sales]) เพราะต้องการเรียง “ความเจริงของข้อมูล” แต่ Column ก็ได้ เช่น ‘Product'[ProductName] ผมใช้ Measure เป็นหลักเพราะมัน stable และสะท้อนความเป็นจริง
TOPNSKIP คือฟังก์ชันสำหรับเลื่อนหน้า (pagination) ที่ดึงจำนวนแถวที่ต้องการจากตาราง โดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามลำดับที่ระบุ เหมือนการพูดว่า “ข้ามไป 20 แถว แล้วเอา 10 แถวถัดไป”
ที่เจ๋งคือ TOPNSKIP ดีสำหรับ UI ที่ต้อง scroll หรือ paging เพราะมีประสิทธิภาพสูงกว่า TOPN ในหลายสถานการณ์ มันเหมาะเมื่อคุณ fix เลขหน้าแล้วแค่ต้องเปลี่ยนจำนวนแถวที่ข้าม
ส่วนตัวผมถือว่า TOPNSKIP เป็นเฟรนดของเรา โดยเฉพาะเวลาทำ Power BI report ที่ต้อง support pagination ขอบต่อ และทำไมไม่ใช้ TOPN? เพราะบางอย่างต้องการความเร็วมากกว่าความยืดหยุ่น