Thep Excel

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

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

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

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

อัปเดต 13 December 2025

Syntax & Arguments

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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

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

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

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

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

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

ผลลัพธ์ตาราง 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 เท่ากัน

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

ผลลัพธ์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 รวมขายในแต่ละประเทศ

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

ผลลัพธ์ยอดขายรวมของเฉพาะ 10 ประเทศที่ยอดขายสูงสุด
ตัวอย่างที่ 4: Top N Dynamic ใช้ Slicer ParameterDynamic 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 หมวด

fx
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
)
)
)

ผลลัพธ์ยอดขายของ 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

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

ฟังก์ชันนี้TOPNTable manipulation
Table manipulation (7)
ADDCOLUMNS

ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย

SAMPLEAXISWITHLOCALMINMAX

คืนตารางย่อยจากตารางต้นทางโดยแบ่งแกน X เป็นช่วงเท่า ๆ กัน และคงแถวที่ให้ค่า Measure ต่ำสุด/สูงสุดในแต่ละช่วง (ต่อซีรีส์) เพื่อช่วยลดจำนวนจุดสำหรับการแสดงผล

SUMMARIZE

SUMMARIZE สร้างตารางสรุปโดยจัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนด คล้าย GROUP BY ใน SQL หรือ Pivot Table ใน Excel คืนค่าตารางที่มีหนึ่งแถวต่อหนึ่ง unique combination ของคอลัมน์ที่เลือก สามารถอ้างถึงคอลัมน์จาก related table ได้โดยตรงโดยไม่ต้องใช้ RELATED มักใช้สร้าง virtual table ใน measure เพื่อทำ intermediate calculations ก่อนใช้ iterator functions อย่าง SUMX, AVERAGEX คำนวณต่อ ⚠️ Best Practice: ใช้ ADDCOLUMNS ครอบ SUMMARIZE แทนการใส่ extension columns ตรงๆ เพื่อ performance และ filter context control ที่ดีกว่า สำหรับ calculated table แนะนำใช้ SUMMARIZECOLUMNS แทนเนื่องจากมี performance ดีกว่าอย่างมาก

SUMMARIZECOLUMNS

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

TOPNPERLEVEL

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

TOPNSKIP

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

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Filter (1)
CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

Comments

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