คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดับแยกต่างหากสำหรับแต่ละเกณฑ์
=TOPN(<N_Value>, <Table> [, <OrderBy_Expression> [, [<Order>] [, <OrderBy_Expression> [, [<Order>]]]...]])
=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 |
เลือกเฉพาะ N รายการที่มีค่ามากที่สุดตามเมเชอร์ เช่น ยอดขาย/กำไร
ส่งตาราง Top N เข้าไปเป็นตัวกรองเพื่อคำนวณยอดรวมเฉพาะ Top N
Top 5 Products by Sales = TOPN( 5, VALUES(Product[ProductName]), [Total Sales], 0 )Top 5 Products by Sales =
TOPN(
5,
VALUES(Product[ProductName]),
[Total Sales],
0
)
ตาราง 5 สินค้าที่มียอดขายสูงสุด เรียงจากมากไปน้อย
Top 3 Countries Stable = TOPN( 3, VALUES(Customer[Country]), [Total Revenue], 0, Customer[Country], 1 )Top 3 Countries Stable =
TOPN(
3,
VALUES(Customer[Country]),
[Total Revenue], 0,
Customer[Country], 1
)
3 ประเทศที่มีรายได้สูงสุด หากมี tie จะเรียงชื่อประเทศเพื่อให้ลำดับแน่นอน
Sales Top 10 Countries = VAR TopCountries = TOPN( 10, VALUES(Customer[Country]), [Total Sales], 0 ) RETURN CALCULATE( [Total Sales], KEEPFILTERS(TopCountries) )Sales Top 10 Countries =
VAR TopCountries =
TOPN(
10,
VALUES(Customer[Country]),
[Total Sales],
0
)
RETURN
CALCULATE(
[Total Sales],
KEEPFILTERS(TopCountries)
)
ยอดขายรวมของเฉพาะ 10 ประเทศที่ยอดขายสูงสุด
Dynamic Top N Sales = VAR TopCount = [Selected Top N] // Measure จาก Slicer RETURN CALCULATE( [Total Sales], KEEPFILTERS( TOPN( TopCount, SUMMARIZE(Product, Pro…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 ได้
หากไม่ระบุ OrderExpr TOPN จะไม่เรียงลำดับและคืนแถวแรก N แถวของตารางในลำดับดั้งเดิม ใช้อย่างระมัดระวัง เพราะผลลัพธ์อาจไม่คาดคะเน
เพราะ TOPN ประเมินค่า OrderBy_Expression แล้วคืน “ทุกแถวที่มีค่า N-th” หากมี tie (เช่น 5 แถวมียอดขาย = 1000) TOPN จะคืนแถวทั้ง 5 แม้ว่าคุณขอเพียง 3 แถว ให้เพิ่ม secondary sort เพื่อตัด tie
RANKX ให้เลขที่ (1, 2, 3…) ในแต่ละแถว; TOPN คืนตารางแถวอันดับต้น N ตัว ถ้าต้องการจำนวนอันดับ ใช้ RANKX; ถ้าต้องการตัวแถวเอง ใช้ TOPN
ได้ เพราะ OrderBy_Expression ประเมินใน row context ของตาราง เช่น [Profit Margin] = [Sales] / [Cost] แล้ว TOPN เรียงตาม Profit Margin ได้
TOPN รองรับ DirectQuery แต่มีข้อจำกัด: ไม่รองรับในคอลัมน์ที่คำนวณและกฎ RLS บางตัว; ถ้ามีปัญหา ให้ทดสอบกับ Direct Query mode
TOPN คืนตารางที่มีแถว “บนสุด N แถว” จากตารางที่กำหนด โดยพิจารณาจากนิพจน์สำหรับจัดลำดับ (เช่น ยอดขายมากไปน้อย) ใช้บ่อยสำหรับทำ Top Customers/Top Products, ทำตารางจัดอันดับ หรือเตรียมชุดแถวไปใช้เป็นตารางตัวกรองใน CALCULATE
ส่วนตัวผม ชอบใช้ TOPN เพราะมันคืนค่าเป็นตาราง ซึ่งสามารถส่งต่อไปยัง CALCULATE ได้เลย บอกได้เลยว่า มันคือวิธีที่ดีที่สุดสำหรับการทำ “Top N dynamic filtering” อยู่ 😎
เรื่องที่ต้องระวัง: ถ้าค่าที่เรียงลำดับมี “ความเสมอ” (เช่น ยอดขายเท่ากัน) TOPN จะคืนแถวทั้งหมดที่มีค่าเท่ากัน จึงอาจได้มากกว่า N แถว เสมอให้เพิ่ม secondary sort เพื่อให้ลำดับแน่นอน