Thep Excel

TOPN – คืนตาราง Top N ตามนิพจน์การเรียงลำดับ

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

=TOPN(<N_Value>, <Table> [, <OrderBy_Expression> [, [<Order>] [, <OrderBy_Expression> [, [<Order>]]]...]])

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
7/10

Difficulty
4/10

Usefulness
7/10

Syntax & Arguments

=TOPN(<N_Value>, <Table> [, <OrderBy_Expression> [, [<Order>] [, <OrderBy_Expression> [, [<Order>]]]...]])

Argument Type Required Default Description
N_Value Integer Yes จำนวนแถวที่ต้องการคืน (scalar value) ถ้าเกินจำนวนแถวจริงจะคืนเท่าที่มี ถ้าค่านี้ ≤ 0 จะคืนตารางว่าง
Table Table Yes ตารางต้นทางที่ต้องการเลือก Top N (อาจเป็นผลจาก VALUES, SUMMARIZE, หรือตารางในโมเดล)
OrderBy_Expression Expression Optional หากไม่ระบุ TOPN จะไม่เรียงลำดับ นิพจน์สำหรับจัดลำดับแถว (ประเมินในrow context ของตาราง) สามารถระบุได้หลายตัวเพื่อทำ secondary/tertiary sort
Order Integer or Boolean Optional 0 (DESC) ทิศทางการเรียง: 0 หรือ FALSE = DESC (มากไปน้อย), 1 หรือ TRUE = ASC (น้อยไปมาก). ต้องระบุหลังจากแต่ละ OrderBy_Expression

How it works

ทำ Top N ลูกค้า/สินค้า

เลือกเฉพาะ N รายการที่มีค่ามากที่สุดตามเมเชอร์ เช่น ยอดขาย/กำไร

ใช้เป็นตารางตัวกรองใน CALCULATE

ส่งตาราง Top N เข้าไปเป็นตัวกรองเพื่อคำนวณยอดรวมเฉพาะ Top N

Examples

ตัวอย่างที่ 1: Top 5 สินค้าตามยอดขาย (Basic Ranking)
Top 5 Products by Sales = TOPN( 5, VALUES(Product[ProductName]), [Total Sales], 0 )
TOPN(5,…) ขอแถว 5 แถว ลำดับแรก, VALUES(Product[ProductName]) = แต่ละสินค้า, [Total Sales] = เกณฑ์เรียง, 0 = DESC
DAX Formula:

Top 5 Products by Sales =
TOPN(
    5,
    VALUES(Product[ProductName]),
    [Total Sales],
    0
)

Result:

ตาราง 5 สินค้าที่มียอดขายสูงสุด เรียงจากมากไปน้อย

ตัวอย่างที่ 2: Top 3 ประเทศ + Secondary Sort (Stable Ranking)
Top 3 Countries Stable = TOPN( 3, VALUES(Customer[Country]), [Total Revenue], 0, Customer[Country], 1 )
Secondary sort (Country ASC) ป้องกัน 'tie breaker' ที่ไม่เสถียร เมื่อ Revenue เท่ากัน
DAX Formula:

Top 3 Countries Stable =
TOPN(
    3,
    VALUES(Customer[Country]),
    [Total Revenue], 0,
    Customer[Country], 1
)

Result:

3 ประเทศที่มีรายได้สูงสุด หากมี tie จะเรียงชื่อประเทศเพื่อให้ลำดับแน่นอน

ตัวอย่างที่ 3: ยอดขาย Top 10 ประเทศ (CALCULATE + KEEPFILTERS)
Sales Top 10 Countries = VAR TopCountries = TOPN( 10, VALUES(Customer[Country]), [Total Sales], 0 ) RETURN CALCULATE( [Total Sales], KEEPFILTERS(TopCountries) )
TOPN คืนตาราง 10 ประเทศ → KEEPFILTERS ส่งผ่านแต่ละประเทศเป็นตัวกรอง → CALCULATE รวมขายในแต่ละประเทศ
DAX Formula:

Sales Top 10 Countries =
VAR TopCountries =
    TOPN(
        10,
        VALUES(Customer[Country]),
        [Total Sales],
        0
    )
RETURN
    CALCULATE(
        [Total Sales],
        KEEPFILTERS(TopCountries)
    )

Result:

ยอดขายรวมของเฉพาะ 10 ประเทศที่ยอดขายสูงสุด

ตัวอย่างที่ 4: Top N Dynamic ใช้ Slicer Parameter
Dynamic Top N Sales = VAR TopCount = [Selected Top N] // Measure จาก Slicer RETURN CALCULATE( [Total Sales], KEEPFILTERS( TOPN( TopCount, SUMMARIZE(Product, Pro…
ใช้ VAR เก็บจำนวนที่ผู้ใช้เลือก SUMMARIZE สร้างแถวหมวดหมู่พร้อมยอดขาย TOPN เลือก Top N หมวด
DAX Formula:

Dynamic Top N Sales =
VAR TopCount = [Selected Top N]  // Measure จาก Slicer
RETURN
    CALCULATE(
        [Total Sales],
        KEEPFILTERS(
            TOPN(
                TopCount,
                SUMMARIZE(Product, Product[Category], "CatSales", [Total Sales]),
                [CatSales],
                0
            )
        )
    )

Result:

ยอดขายของ Top N หมวดหมู่ โดย N สามารถเปลี่ยนจากปุ่ม/Slicer ได้

FAQs

ถ้าไม่ระบุ OrderExpr จะเกิดอะไรขึ้น?

หากไม่ระบุ OrderExpr TOPN จะไม่เรียงลำดับและคืนแถวแรก N แถวของตารางในลำดับดั้งเดิม ใช้อย่างระมัดระวัง เพราะผลลัพธ์อาจไม่คาดคะเน

ทำไมบางครั้งได้มากกว่า N แถวกลับมา?

เพราะ TOPN ประเมินค่า OrderBy_Expression แล้วคืน “ทุกแถวที่มีค่า N-th” หากมี tie (เช่น 5 แถวมียอดขาย = 1000) TOPN จะคืนแถวทั้ง 5 แม้ว่าคุณขอเพียง 3 แถว ให้เพิ่ม secondary sort เพื่อตัด tie

TOPN vs RANKX ต่างกันยังไง?

RANKX ให้เลขที่ (1, 2, 3…) ในแต่ละแถว; TOPN คืนตารางแถวอันดับต้น N ตัว ถ้าต้องการจำนวนอันดับ ใช้ RANKX; ถ้าต้องการตัวแถวเอง ใช้ TOPN

สามารถใช้ TOPN กับ measure ที่เป็น virtual column ได้ไหม?

ได้ เพราะ OrderBy_Expression ประเมินใน row context ของตาราง เช่น [Profit Margin] = [Sales] / [Cost] แล้ว TOPN เรียงตาม Profit Margin ได้

TOPN ทำงานใน DirectQuery mode ได้ไหม?

TOPN รองรับ DirectQuery แต่มีข้อจำกัด: ไม่รองรับในคอลัมน์ที่คำนวณและกฎ RLS บางตัว; ถ้ามีปัญหา ให้ทดสอบกับ Direct Query mode

Resources & Related

Additional Notes

TOPN คืนตารางที่มีแถว “บนสุด N แถว” จากตารางที่กำหนด โดยพิจารณาจากนิพจน์สำหรับจัดลำดับ (เช่น ยอดขายมากไปน้อย) ใช้บ่อยสำหรับทำ Top Customers/Top Products, ทำตารางจัดอันดับ หรือเตรียมชุดแถวไปใช้เป็นตารางตัวกรองใน CALCULATE

ส่วนตัวผม ชอบใช้ TOPN เพราะมันคืนค่าเป็นตาราง ซึ่งสามารถส่งต่อไปยัง CALCULATE ได้เลย บอกได้เลยว่า มันคือวิธีที่ดีที่สุดสำหรับการทำ “Top N dynamic filtering” อยู่ 😎

เรื่องที่ต้องระวัง: ถ้าค่าที่เรียงลำดับมี “ความเสมอ” (เช่น ยอดขายเท่ากัน) TOPN จะคืนแถวทั้งหมดที่มีค่าเท่ากัน จึงอาจได้มากกว่า N แถว เสมอให้เพิ่ม secondary sort เพื่อให้ลำดับแน่นอน

Leave a Reply

Your email address will not be published. Required fields are marked *