ฟังก์ชันเชิงเครื่องมือสำหรับเลือกจำนวนแถวสูงสุด (Top N) ต่อ ระดับในโครงสร้างลำดับชั้น (hierarchy) ที่มีการขยาย/ยุบโหนด
=TOPNPERLEVEL(<Rows>, <Table>, <LevelsDefinition>, <NodesExpanded>, <LevelsBoundaries>, <RestartIndicatorColumnName>)
=TOPNPERLEVEL(<Rows>, <Table>, <LevelsDefinition>, <NodesExpanded>, <LevelsBoundaries>, <RestartIndicatorColumnName>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Rows | integer | Yes | จำนวนแถว (Top N) ที่ต้องการคืนต่อระดับลำดับชั้น | |
| Table | table | Yes | ตารางต้นทางที่บรรจุข้อมูลลำดับชั้น (เช่น สินค้า ประเทศ บุคคล) | |
| LevelsDefinition | table | Yes | ตารางนิยามระดับ ที่ระบุคอลัมน์แต่ละระดับและลำดับการเรียงลำดับ (order indicator) | |
| NodesExpanded | table | Yes | ตารางสถานะการขยายโหนด (expanded nodes) ที่แสดงว่าต้องคืนแถวของระดับใดบ้าง | |
| LevelsBoundaries | table | Yes | ตารางขอบเขตของแต่ละระดับ ที่กำหนดเงื่อนไขการเลือกแถว (เช่น หลังจากข้อมูลใด) | |
| RestartIndicatorColumnName | text | Yes | ชื่อคอลัมน์ที่ฟังก์ชันจะเพิ่มเข้าไป เพื่อบ่งชี้ว่าแถวนั้นอยู่ก่อนหรือหลังขอบเขต (1 = ก่อน, 2 = หลัง) |
ใช้เป็นเครื่องมือในการเลือกแถวที่ต้องแสดงตามระดับที่ผู้ใช้ขยายใน visual
ใช้ลดจำนวนแถวที่คืนในแต่ละระดับ เมื่อโครงสร้างลำดับชั้นมีขนาดใหญ่
TOPNPERLEVEL( 10, Products, LevelsDefinition, NodesExpanded, LevelsBoundaries, "RestartFlag" )=TOPNPERLEVEL(
10,
Products,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"RestartFlag"
)
ตารางย่อยของ Products ที่เลือก Top 10 รายการต่อระดับในลำดับชั้น พร้อมคอลัมน์ RestartFlag
VAR TopByLevel = TOPNPERLEVEL( 10, Products, LevelsDefinition, NodesExpanded, LevelsBoundaries, "RestartFlag" ) RETURN TOPNSKIP( 5, 2, TopByLevel, [ProductName]…VAR TopByLevel = TOPNPERLEVEL(
10,
Products,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"RestartFlag"
)
RETURN
TOPNSKIP(
5,
2,
TopByLevel,
[ProductName]
)
แสดงผลลัพธ์จาก TOPNPERLEVEL โดยข้ามแถว 5 แถวแรก และเลือกเพียง 2 แถวถัดไป
VAR SelectionTable = TOPNPERLEVEL( 5, Sales, LevelsDefinition, NodesExpanded, LevelsBoundaries, "IsRestart" ) RETURN COUNTROWS(SelectionTable)VAR SelectionTable = TOPNPERLEVEL(
5,
Sales,
LevelsDefinition,
NodesExpanded,
LevelsBoundaries,
"IsRestart"
)
RETURN
COUNTROWS(SelectionTable)
ตัวเลขที่แสดงจำนวนแถวทั้งหมดที่คืนจาก TOPNPERLEVEL
ไม่ใช่ครับ TOPNPERLEVEL เป็นฟังก์ชันเชิงเครื่องมือ (extension function) ที่ออกแบบมาโดยเฉพาะสำหรับงานการสร้าง visual ที่มี drill-down hierarchy ใช้ได้เฉพาะเมื่อเชื่อมต่อ Analysis Services หรือโมเดลลำดับชั้นจริง ถ้าท่านเขียน DAX ปกติเพื่อสร้าง measure ปกติคงไม่ต้องใช้ครับ
เพราะว่า TOPNPERLEVEL ต้องการข้อมูลที่ครบถ้วน: นิยามระดับของ hierarchy ข้อมูลเกี่ยวกับว่าโหนดใดถูกขยาย และขอบเขต (boundary) ของแต่ละระดับ ถึงจะคืนผลลัพธ์ที่ถูกต้องตามสถานะการขยาย/ยุบ ของ visual ได้ ผมมองว่านี่คือ trade-off ที่จำเป็นสำหรับการทำงานกับ hierarchy ที่ซับซ้อน
ใช่ครับ เมื่อ TOPNPERLEVEL ถูกเรียกในสถานการณ์ที่มี row context (เช่นอยู่ในตารางคำนวณ column formula หรือใน iterator) ฟังก์ชันจะทำ context transition โดยอัตโนมัติ แล้วทำงานใน filter context เพื่อจัดการกับพารามิเตอร์ลำดับชั้น
ขึ้นอยู่กับงานของคุณ ถ้าต้อง Top N แบบปกติ (ไม่ต้องสนใจลำดับชั้น) ให้ใช้ TOPN หรือ TOPNSKIP เพื่อความง่าย แต่ถ้า visual ของคุณมี multi-level drill-down hierarchy และต้องแสดง Top N ต่อระดับ ค่อยใช้ TOPNPERLEVEL ครับ
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 จริงๆ คงไม่ต้องใช้ครับ