Thep Excel

TOPNPERLEVELเลือก Top N ต่อระดับลำดับชั้น

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

fx
=TOPNPERLEVEL(<Rows>, <Table>, <LevelsDefinition>, <NodesExpanded>, <LevelsBoundaries>, <RestartIndicatorColumnName>)

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

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
Rows integer จำนวนแถว (Top N) ที่ต้องการคืนต่อระดับลำดับชั้น
Table table ตารางต้นทางที่บรรจุข้อมูลลำดับชั้น (เช่น สินค้า ประเทศ บุคคล)
LevelsDefinition table ตารางนิยามระดับ ที่ระบุคอลัมน์แต่ละระดับและลำดับการเรียงลำดับ (order indicator)
NodesExpanded table ตารางสถานะการขยายโหนด (expanded nodes) ที่แสดงว่าต้องคืนแถวของระดับใดบ้าง
LevelsBoundaries table ตารางขอบเขตของแต่ละระดับ ที่กำหนดเงื่อนไขการเลือกแถว (เช่น หลังจากข้อมูลใด)
RestartIndicatorColumnName text ชื่อคอลัมน์ที่ฟังก์ชันจะเพิ่มเข้าไป เพื่อบ่งชี้ว่าแถวนั้นอยู่ก่อนหรือหลังขอบเขต (1 = ก่อน, 2 = หลัง)

Additional Notes

TOPNPERLEVEL เป็นฟังก์ชันเชิงเครื่องมือ (extension function) ของ Power BI ที่ออกแบบมาเพื่อทำงานกับข้อมูลแบบลำดับชั้น (hierarchical data) โดยเลือกจำนวนแถวสูงสุดต่อระดับ ฟังก์ชันนี้รับข้อมูลของนิยามระดับ โหนดที่ขยาย และขอบเขตของแต่ละระดับ เพื่อคืนตารางย่อยที่สอดคล้องกับการทำงานแบบ hierarchy เป็นประโยชน์เมื่อต้องการแสดง Top N รายการต่อระดับในการขยาย/ยุบโหนดของ visual

ที่เจ๋งคือ TOPNPERLEVEL ทำให้เราสามารถควบคุมได้ว่า เมื่อผู้ใช้ขยายโหนดในการแสดงผล (drill-down) จะแสดง Top N รายการต่อระดับอย่างไร โดยไม่ต้องสร้างตรรมชาติ จำนวน expressions ที่ซับซ้อนสำหรับแต่ละระดับ

ส่วนตัวผมจะบอกว่า TOPNPERLEVEL เป็นฟังก์ชันที่สำหรับ Power BI professional ที่จัดการ hierarchy ที่เชื่อมกับ Analysis Services หรือ โมเดลข้อมูลที่ซับซ้อน ไม่ใช่ฟังก์ชันสำหรับ measure ทั่วไป และถ้าไม่ได้ทำงานกับ hierarchy ที่มี drill-down interactivity จริงๆ คงไม่ต้องใช้ครับ

How it works

รองรับ visual แบบ hierarchy ที่ต้องขยาย/ยุบระดับ

ใช้เป็นเครื่องมือในการเลือกแถวที่ต้องแสดงตามระดับที่ผู้ใช้ขยายใน visual

จำกัดจำนวนแถวต่อระดับเพื่อประสิทธิภาพ

ใช้ลดจำนวนแถวที่คืนในแต่ละระดับ เมื่อโครงสร้างลำดับชั้นมีขนาดใหญ่

Examples

ตัวอย่างที่ 1: ตำแหน่งพื้นฐานของ TOPNPERLEVELTOPNPERLEVEL( 10, Products, LevelsDefinition, NodesExpanded, LevelsBoundaries, "RestartFlag" )

คืนจำนวนแถวสูงสุด 10 ต่อระดับหนึ่ง โดยคอลัมน์ RestartFlag บ่งชี้ว่าแถวนั้นเป็นจุดเริ่มต้นของขอบเขตใหม่หรือไม่

fx
=TOPNPERLEVEL(
10,
Products,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"RestartFlag"
)

ผลลัพธ์ตารางย่อยของ Products ที่เลือก Top 10 รายการต่อระดับในลำดับชั้น พร้อมคอลัมน์ RestartFlag
ตัวอย่างที่ 2: ใช้กับ TOPNSKIP สำหรับการเลื่อนหน้าVAR TopByLevel = TOPNPERLEVEL( 10, Products, LevelsDefinition, NodesExpanded, LevelsBoundaries, "RestartFlag" ) RETURN TOPNSKIP( 5, 2, TopByLevel, [ProductName]…

ใช้ TOPNPERLEVEL เพื่อจำกัดจำนวนแถวต่อระดับก่อน แล้วใช้ TOPNSKIP เพื่อดึงข้อมูลแบบเลื่อนหน้า (pagination)

fx
VAR TopByLevel = TOPNPERLEVEL(
10,
Products,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"RestartFlag"
)
RETURN
TOPNSKIP(
5,
2,
TopByLevel,
[ProductName]
)

ผลลัพธ์แสดงผลลัพธ์จาก TOPNPERLEVEL โดยข้ามแถว 5 แถวแรก และเลือกเพียง 2 แถวถัดไป
ตัวอย่างที่ 3: ตรวจสอบผลลัพธ์ด้วย COUNTROWSVAR SelectionTable = TOPNPERLEVEL( 5, Sales, LevelsDefinition, NodesExpanded, LevelsBoundaries, "IsRestart" ) RETURN COUNTROWS(SelectionTable)

ใช้ COUNTROWS เพื่อตรวจสอบว่า TOPNPERLEVEL คืนจำนวนแถวเท่าไหร่จริง โดยเฉพาะเมื่อพารามิเตอร์ซับซ้อน

fx
VAR SelectionTable = TOPNPERLEVEL(
5,
Sales,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"IsRestart"
)
RETURN
COUNTROWS(SelectionTable)

ผลลัพธ์ตัวเลขที่แสดงจำนวนแถวทั้งหมดที่คืนจาก TOPNPERLEVEL

FAQs

TOPNPERLEVEL เป็นฟังก์ชันที่ใช้บ่อยหรือไม่?+

ไม่ใช่ครับ TOPNPERLEVEL เป็นฟังก์ชันเชิงเครื่องมือ (extension function) ที่ออกแบบมาโดยเฉพาะสำหรับงานการสร้าง visual ที่มี drill-down hierarchy ใช้ได้เฉพาะเมื่อเชื่อมต่อ Analysis Services หรือโมเดลลำดับชั้นจริง ถ้าท่านเขียน DAX ปกติเพื่อสร้าง measure ปกติคงไม่ต้องใช้ครับ

ทำไม TOPNPERLEVEL ถึงต้องพารามิเตอร์เยอะ และดูซับซ้อน?+

เพราะว่า TOPNPERLEVEL ต้องการข้อมูลที่ครบถ้วน: นิยามระดับของ hierarchy ข้อมูลเกี่ยวกับว่าโหนดใดถูกขยาย และขอบเขต (boundary) ของแต่ละระดับ ถึงจะคืนผลลัพธ์ที่ถูกต้องตามสถานะการขยาย/ยุบ ของ visual ได้ ผมมองว่านี่คือ trade-off ที่จำเป็นสำหรับการทำงานกับ hierarchy ที่ซับซ้อน

TOPNPERLEVEL มีความสัมพันธ์กับ context transition ไหม?+

ใช่ครับ เมื่อ TOPNPERLEVEL ถูกเรียกในสถานการณ์ที่มี row context (เช่นอยู่ในตารางคำนวณ column formula หรือใน iterator) ฟังก์ชันจะทำ context transition โดยอัตโนมัติ แล้วทำงานใน filter context เพื่อจัดการกับพารามิเตอร์ลำดับชั้น

ต้องใช้ TOPNPERLEVEL เสมอหรือ TOPN/TOPNSKIP ที่ง่ายกว่าเพียงพอ?+

ขึ้นอยู่กับงานของคุณ ถ้าต้อง Top N แบบปกติ (ไม่ต้องสนใจลำดับชั้น) ให้ใช้ TOPN หรือ TOPNSKIP เพื่อความง่าย แต่ถ้า visual ของคุณมี multi-level drill-down hierarchy และต้องแสดง Top N ต่อระดับ ค่อยใช้ TOPNPERLEVEL ครับ

Resources & Related

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

ฟังก์ชันนี้TOPNPERLEVELTable manipulation
Table manipulation (4)
ROLLUPGROUP

ROLLUPGROUP ระบุชุดคอลัมน์ที่จะถูกพิจารณาเป็น “กลุ่มเดียว” สำหรับการสร้าง subtotal/roll-up ช่วยลด subtotal บางระดับ และมักใช้ร่วมกับ ROLLUP ใน SUMMARIZE

SUMMARIZECOLUMNS

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

TOPN

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

TOPNSKIP

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

Filter (2)
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 โดยตรงแทน

Comments

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