ดึงแถวจากตารางโดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามการเรียงลำดับที่ระบุ มีประสิทธิภาพสูงสำหรับงาน pagination
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| Rows | integer | จำนวนแถวที่ต้องการคืน (ต้องเป็นจำนวนเต็มบวก) |
| Skip | integer | จำนวนแถวที่ต้องการข้ามก่อนเริ่มคืนผลลัพธ์ (0 สำหรับไม่ข้าม, 0+ สำหรับการเลื่อนหน้า) |
| Table | table | ตารางต้นทางที่ต้องการดึงแถวจาก (ต้องใช้ physical columns, ไม่ใช่ CALCULATE expressions เมื่อใช้ Skip) |
| [OrderExpr]ไม่บังคับ | expression | นิพจน์สำหรับจัดลำดับแถวก่อนทำการ skip (สำคัญมาก สำหรับความเสถียร) ใส่ได้หลายตัว |
| [Order]ไม่บังคับ | keyword | ทิศทางการเรียง ASC (น้อยไปมาก) หรือ DESC (มากไปน้อย) ค่าเริ่มต้นคือ DESC |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
TOPNSKIP คือฟังก์ชันสำหรับเลื่อนหน้า (pagination) ที่ดึงจำนวนแถวที่ต้องการจากตาราง โดยข้ามจำนวนแถวที่กำหนดก่อน แล้วคืนแถวถัดไปตามลำดับที่ระบุ เหมือนการพูดว่า “ข้ามไป 20 แถว แล้วเอา 10 แถวถัดไป”
ที่เจ๋งคือ TOPNSKIP ดีสำหรับ UI ที่ต้อง scroll หรือ paging เพราะมีประสิทธิภาพสูงกว่า TOPN ในหลายสถานการณ์ มันเหมาะเมื่อคุณ fix เลขหน้าแล้วแค่ต้องเปลี่ยนจำนวนแถวที่ข้าม
ส่วนตัวผมถือว่า TOPNSKIP เป็นเฟรนดของเรา โดยเฉพาะเวลาทำ Power BI report ที่ต้อง support pagination ขอบต่อ และทำไมไม่ใช้ TOPN? เพราะบางอย่างต้องการความเร็วมากกว่าความยืดหยุ่น
ต้องการแสดงผลทีละหน้า เช่น หน้าแรก 20 แถว, หน้าที่สอง 20 แถวถัดไป
เลือกช่วงอันดับ 1-20, 21-40, … ด้วยการกำหนด Skip
Rows=20 ให้ 20 แถว, Skip=20 ข้าม 20 แถวแรก = ได้หน้า 2 ของชุดข้อมูล
ใช้ VAR เพื่อทำให้ pagination formula ชัดเจนขึ้น และมี secondary sort เพื่อป้องกันการเปลี่ยนแปลงลำดับเมื่อค่าเท่ากัน
TOPNSKIP คืนตาราง (20 rows มาจาก skip, 10 rows จาก rows parameter) แล้วส่งเป็นตัวกรองให้ CALCULATE คำนวณยอดขายใหม่บนกลุ่มที่ได้
Skip=0 ใช้ได้เมื่อต้องการแค่หน้าแรก (ฟังก์ชันจะทำงานเหมือน TOPN บ้าง)
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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที
คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดับแยกต่างหากสำหรับแต่ละเกณฑ์
ฟังก์ชันเชิงเครื่องมือสำหรับเลือกจำนวนแถวสูงสุด (Top N) ต่อ ระดับในโครงสร้างลำดับชั้น (hierarchy) ที่มีการขยาย/ยุบโหนด
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
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 ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
ORDERBY ระบุลำดับการเรียงลำดับ (ASC/DESC) และการจัดการค่าว่าง สำหรับ window functions เช่น INDEX, OFFSET, WINDOW เพื่อกำหนดลำดับของแถวภายในกลุ่ม
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่