---
title: TOPNPERLEVEL – เลือก Top N ต่อระดับลำดับชั้น
url: https://www.thepexcel.com/functions/dax/table-manipulation/topnperlevel-dax/
type: function-explainer
program: DAX
syntax: "TOPNPERLEVEL(<Rows>, <Table>, <LevelsDefinition>, <NodesExpanded>, <LevelsBoundaries>, <RestartIndicatorColumnName>)"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 5
  usefulness: 5
---

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

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

## คำอธิบาย

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

## Syntax

```excel
TOPNPERLEVEL(&lt;Rows&gt;, &lt;Table&gt;, &lt;LevelsDefinition&gt;, &lt;NodesExpanded&gt;, &lt;LevelsBoundaries&gt;, &lt;RestartIndicatorColumnName&gt;)
```

## Arguments

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

## เคสการใช้งาน

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

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

_เหมาะกับ:_ hierarchy-expand-collapse

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

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

_เหมาะกับ:_ limit-rows-per-level

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ตำแหน่งพื้นฐานของ TOPNPERLEVEL

```excel
TOPNPERLEVEL(
    10,
    Products,
    LevelsDefinition,
    NodesExpanded,
    LevelsBoundaries,
    "RestartFlag"
)
```

**ผลลัพธ์:** `ตารางย่อยของ Products ที่เลือก Top 10 รายการต่อระดับในลำดับชั้น พร้อมคอลัมน์ RestartFlag`

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

### 2. ตัวอย่างที่ 2: ใช้กับ TOPNSKIP สำหรับการเลื่อนหน้า

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

**ผลลัพธ์:** `แสดงผลลัพธ์จาก TOPNPERLEVEL โดยข้ามแถว 5 แถวแรก และเลือกเพียง 2 แถวถัดไป`

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

### 3. ตัวอย่างที่ 3: ตรวจสอบผลลัพธ์ด้วย COUNTROWS

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

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

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

## หมายเหตุเพิ่มเติม

- ผมแนะนำให้เจาะจงใจสำคัญ: หากปกติใช้ TOPN, TOPNSKIP หรือ SUMMARIZECOLUMNS ได้ ไม่จำเป็นต้องไปใช้ TOPNPERLEVEL เพราะฟังก์ชันนี้เฉพาะทาง และ setup พารามิเตอร์อาจเสียเวลา

- ส่วนตัวผมมองว่า TOPNPERLEVEL ใช้งานจริงได้ดีกับสถานการณ์ที่ผู้ใช้ทำการขยาย/ยุบโหนด (drill-down) ใน Power BI dashboard และต้อง limit จำนวนรายการทีละระดับ

- เมื่อตั้ง RestartIndicatorColumnName ให้แน่ใจว่าชื่อคอลัมน์ไม่ conflict กับคอลัมน์ที่มีอยู่แล้ว เพื่อให้ออกมาชัดเจนและง่ายต่อการ debug

- ถ้า TOPNPERLEVEL ทำงานผิดพลาด ให้เริ่มจากการ debug ด้วย COUNTROWS และการตรวจสอบ RestartFlag ว่าทำเครื่องหมายไว้ถูกต้องหรือไม่

## คำถามที่พบบ่อย

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

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

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

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

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

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

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

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

## ฟังก์ชันที่เกี่ยวข้อง

- topn
- topnskip
- summarizecolumns
- countrows
- isinscope
- rollupgroup

## แหล่งข้อมูลเพิ่มเติม

- [DAX Guide: TOPNPERLEVEL](https://dax.guide/topnperlevel/) _(guide)_
- [Microsoft Learn: Extension Functions (Power BI)](https://learn.microsoft.com/en-us/power-bi/developer/visuals/power-bi-custom-visuals-certified) _(official)_

---

_Source: [https://www.thepexcel.com/functions/dax/table-manipulation/topnperlevel-dax/](https://www.thepexcel.com/functions/dax/table-manipulation/topnperlevel-dax/)_
