---
title: RANKX – จัดอันดับด้วย Iterator Pattern (รองรับการจัดการอันดับเสมอ)
url: https://www.thepexcel.com/functions/dax/statistical/rankx-dax/
type: function-explainer
program: DAX
syntax: "RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])"
date: 2025-12-18
scores:
  popularity: 8
  difficulty: 6
  usefulness: 8
---

# RANKX – จัดอันดับด้วย Iterator Pattern (รองรับการจัดการอันดับเสมอ)

> จัดอันดับรายการโดย iterate table และประเมิน expression

## คำอธิบาย

RANKX เป็น iterator function ที่ iterate ทุกแถวใน table เพื่อประเมิน expression แล้วคืนอันดับของค่าใน current context เมื่อเทียบกับค่าทั้งหมด สามารถกำหนดทิศทางการเรียง (ASC/DESC) และวิธีจัดการอันดับเสมอ (Skip/Dense) ใช้บ่อยกับ ALL/ALLSELECTED เพื่อควบคุมชุดข้อมูลที่เปรียบเทียบ เหมาะสำหรับการจัดอันดับสินค้า ลูกค้า ภูมิภาค และ Top/Bottom analysis

## Syntax

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;[, &lt;value&gt;[, &lt;order&gt;[, &lt;ties&gt;]]])
```

**Variant**

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;)
```

รูปแบบพื้นฐาน - จัดอันดับจากมากไปน้อย (DESC) แบบ Skip ties

**Variant**

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;, , 0)
```

ระบุ order เป็น 0 หรือ FALSE สำหรับ descending order (มากไปน้อย)

**Variant**

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;, , 1)
```

ระบุ order เป็น 1 หรือ TRUE สำหรับ ascending order (น้อยไปมาก)

**Variant**

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;, , , Dense)
```

ใช้ Dense ties - อันดับถัดไปไม่ข้ามเลข (1, 2, 2, 3)

**Variant**

```excel
RANKX(&lt;table&gt;, &lt;expression&gt;, &lt;value&gt;)
```

ระบุค่าที่ต้องการหาอันดับแบบชัดเจน แทนที่จะใช้ค่าใน current context

**Variant**

```excel
RANKX(ALL(&lt;table&gt;[&lt;column&gt;]), [&lt;measure&gt;])
```

รูปแบบยอดนิยม - ใช้ ALL เพื่อให้เห็นรายการทั้งหมดสำหรับเปรียบเทียบ

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| table | Yes | table |  | ตารางที่ใช้ iterate เพื่อประเมิน expression - RANKX จะวนทุกแถวในตารางนี้ มักใช้ร่วมกับ ALL, ALLSELECTED, ALLEXCEPT เพื่อควบคุม filter context ให้เห็นรายการครบตามต้องการ |
| expression | Yes | expression |  | นิพจน์หรือ measure ที่ใช้เป็นค่าในการจัดอันดับ - จะถูกประเมินในแต่ละ row ของ table ค่า BLANK ถือเป็น 0 (ถ้าเป็นตัวเลข) หรือ empty text (ถ้าเป็นข้อความ) |
| value | No | any | ใช้ค่าจาก expression ใน current context | ค่าที่ต้องการหาอันดับแบบระบุชัด - ถ้าไม่ระบุจะใช้ค่าของ expression ใน current context แทน ใช้เมื่อต้องการหาอันดับของค่าที่กำหนดเองโดยไม่ขึ้นกับบริบทปัจจุบัน |
| order | No | number | 0 (DESC - มากไปน้อย) | ทิศทางการเรียงลำดับ: 0 หรือ FALSE = จากมากไปน้อย (DESC, ค่าสูงสุดได้อันดับ 1) / 1 หรือ TRUE = จากน้อยไปมาก (ASC, ค่าต่ำสุดได้อันดับ 1) |
| ties | No | enum | Skip | วิธีจัดการอันดับเสมอ: Skip = ข้ามลำดับเมื่อเสมอ (1, 2, 2, 2, 5) / Dense = ไม่ข้ามลำดับ (1, 2, 2, 2, 3) |

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

### จัดอันดับสินค้า/ลูกค้าตามยอดขาย

สร้าง calculated column หรือ measure เพื่อแสดงอันดับของสินค้า ลูกค้า หรือภูมิภาคตามยอดขาย ใช้ ALL เพื่อให้เห็นรายการทั้งหมด

_เหมาะกับ:_ sales-ranking

### จัดอันดับภายในกลุ่ม (Ranking within Groups)

จัดอันดับสินค้าภายในหมวดหมู่เดียวกัน หรือพนักงานภายในแผนกเดียวกัน ใช้ ALLEXCEPT เพื่อคงตัวกรองของกลุ่มไว้

_เหมาะกับ:_ within-group-ranking

### Top N Analysis

หา Top 10 สินค้าขายดี หรือ Bottom 5 สาขาขายแย่ ใช้ร่วมกับ TOPN หรือ filter ตาม rank

_เหมาะกับ:_ top-bottom-analysis

### Dense Ranking สำหรับคะแนนสอบ

จัดอันดับนักเรียนตามคะแนนสอบแบบ Dense (ไม่ข้ามเลข) เหมาะกับระบบคะแนนที่ต้องการให้อันดับต่อเนื่องกัน

_เหมาะกับ:_ dense-ranking

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: อันดับสินค้าตามยอดขาย (พื้นฐาน)

```excel
Product Rank = 
RANKX(
    ALL(Products[ProductKey]),
    [Total Sales]
)
```

**ผลลัพธ์:** `อันดับ 1, 2, 3, ... ตามยอดขายจากมากไปน้อย`

ALL(Products[ProductKey]) ทำให้ RANKX เห็นสินค้าทั้งหมด ไม่ถูกจำกัดโดย filter context ปัจจุบัน
.
[Total Sales] คือ measure ที่ใช้เปรียบเทียบ ค่าเริ่มต้นเป็น DESC (มากไปน้อย) และ Skip ties
.
เทคนิคนี้เป็น pattern หลักที่ใช้บ่อยมากครับ เพราะถ้าไม่ใส่ ALL สินค้าแต่ละตัวจะเห็นแค่ตัวเอง แล้วได้อันดับ 1 หมด 😅

### 2. ตัวอย่างที่ 2: Dense Rank (ไม่ข้ามเลขเมื่อเสมอ)

```excel
Product Dense Rank = 
RANKX(
    ALL(Products[ProductKey]),
    [Total Sales],
    ,
    DESC,
    Dense
)
```

**ผลลัพธ์:** `อันดับต่อเนื่อง 1, 2, 2, 3 แทนที่จะเป็น 1, 2, 2, 4`

ties argument ระบุเป็น Dense ทำให้อันดับถัดจากอันดับเสมอไม่ข้ามเลข
.
ถ้ามี 3 สินค้าอันดับ 2 อันดับถัดไปจะเป็น 3 (ไม่ใช่ 5) เหมาะกับระบบที่ต้องการอันดับต่อเนื่อง
.
ส่วนตัวผมชอบใช้ Dense สำหรับระบบคะแนนหรือรีวิว เพราะดูเข้าใจง่ายกว่าครับ 😎

### 3. ตัวอย่างที่ 3: จัดอันดับภายในหมวดสินค้า

```excel
Category Rank = 
RANKX(
    ALLEXCEPT(
        Products,
        Products[Category]
    ),
    [Total Sales]
)
```

**ผลลัพธ์:** `อันดับของสินค้าภายในหมวดหมู่เดียวกัน (แต่ละหมวดมีอันดับ 1, 2, 3, ...)`

ALLEXCEPT(Products, Products[Category]) ล้าง filter ทั้งหมดจาก Products ยกเว้น Category ทำให้การจัดอันดับเกิดขึ้นภายในกลุ่มหมวดหมู่เดียวกัน
.
แต่ละหมวดจะมีสินค้าอันดับ 1 ของตัวเอง นี่คือเทคนิคที่ใช้บ่อยมากสำหรับ Report แบบแบ่งตามกลุ่มครับ 💡

### 4. ตัวอย่างที่ 4: Ascending Order (น้อยไปมาก)

```excel
Customer Low Rank = 
RANKX(
    ALL(Customers[CustomerKey]),
    [Total Sales],
    ,
    ASC
)
```

**ผลลัพธ์:** `อันดับ 1 สำหรับลูกค้าที่ซื้อน้อยที่สุด`

order argument ระบุเป็น ASC (หรือ 1 หรือ TRUE) ทำให้ค่าต่ำสุดได้อันดับ 1
.
ใช้สำหรับหา Bottom performers หรือลูกค้าที่ต้องการความช่วยเหลือ เทคนิคนี้ดีสำหรับระบุกลุ่มเสี่ยงครับ 📊

### 5. ตัวอย่างที่ 5: ใช้กับ VAR และ CALCULATE (Advanced)

```excel
Sales Rank With Context = 
VAR CurrentSales = [Total Sales]
VAR AllProducts = ALL(Products)
VAR ProductRank = 
    RANKX(
        AllProducts,
        CALCULATE([Total Sales]),
        CurrentSales,
        DESC,
        Dense
    )
RETURN
    ProductRank
```

**ผลลัพธ์:** `อันดับที่คำนวณด้วยค่า sales ปัจจุบัน`

ใช้ VAR เก็บ CurrentSales และ AllProducts ไว้ก่อน ทำให้โค้ดอ่านง่ายขึ้นและ debug ได้สะดวก
.
value argument ใช้ CurrentSales (ค่าใน current context) เปรียบเทียบกับค่าทั้งหมดที่คำนวณจาก CALCULATE([Total Sales]) ในแต่ละ product
.
Pattern นี้ผมแนะนำให้ใช้สำหรับ measure ที่ซับซ้อน เพราะช่วยให้เข้าใจ logic ได้ดีขึ้นเยอะครับ 💡

### 6. ตัวอย่างที่ 6: จัดอันดับด้วย Filter Context (Grand Rank)

```excel
Global Product Rank = 
RANKX(
    ALLSELECTED(Products[ProductKey]),
    [Total Sales]
)
```

**ผลลัพธ์:** `อันดับสินค้าตาม filter ที่ user เลือกใน slicer/filter`

ALLSELECTED ใช้แทน ALL เพื่อเคารพ filter ที่ user เลือกไว้ แต่ลบ filter ของ visual ปัจจุบันออก
.
ทำให้ได้อันดับ "ภายในชุดข้อมูลที่เลือก" เหมาะกับ interactive reports ที่ user สามารถเลือก filter ได้เอง
.
เทคนิคนี้ผมชอบมากครับ เพราะทำให้ Report มี dynamic ranking ที่เปลี่ยนตาม slicer 😎

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

⚠️ **Decimal Precision Warning**: RANKX อาจให้ผลลัพธ์ไม่คาดคิดกับ Decimal Number data type เนื่องจากปัญหา floating-point precision แนะนำให้ใช้ Fixed Decimal Number หรือใช้ ROUND function ก่อนจัดอันดับ
.
ส่วนตัวผมเจอปัญหานี้มาแล้ว และแก้ด้วย ROUND เลยครับ ปลอดภัยกว่า 😅

💡 **Performance Tip**: RANKX เป็น iterator function ที่คำนวณหนักเมื่อ table มีจำนวนแถวมาก ควรทดสอบประสิทธิภาพและพิจารณาลด cardinality ของ table ถ้าจำเป็น
.
ถ้า Report ช้า ลองเช็คว่าใช้ RANKX กับตารางขนาดใหญ่มั้ย บางครั้งอาจต้องคิด logic ใหม่ครับ

🔍 **Context Control**: สิ่งสำคัญที่สุดคือการควบคุม table argument ด้วย ALL/ALLSELECTED/ALLEXCEPT ให้เหมาะสม เพื่อให้ RANKX เห็นรายการที่ถูกต้องสำหรับการเปรียบเทียบ
.
นี่คือ skill พื้นฐานที่ต้องเข้าใจถ้าจะใช้ RANKX ให้คุ้มค่า ผมแนะนำให้ทดลองใช้ ALL ก่อน แล้วค่อยๆ ปรับเป็น ALLSELECTED หรือ ALLEXCEPT ตามความเหมาะสม 💪

📊 **DirectQuery Limitation**: RANKX ไม่รองรับใน DirectQuery mode สำหรับ calculated columns และ row-level security (RLS) rules ถ้าใช้ DirectQuery ต้องระวังเรื่องนี้นะครับ

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

**Q: ทำไมได้อันดับ 1 เกือบทุกแถว?**

นี่เป็นปัญหาที่เจอบ่อยมากครับ 😅 สาเหตุคือ table argument ที่ส่งให้ RANKX ถูก filter context จำกัดมากเกินไป ทำให้แต่ละแถวเห็นแค่ตัวเองในตาราง จึงได้อันดับ 1 ทุกแถว
.
แก้ไขโดยใช้ ALL, ALLSELECTED หรือ ALLEXCEPT เพื่อให้ RANKX เห็นรายการครบตามต้องการ ส่วนตัวผมแนะนำให้ใช้ ALL เป็นจุดเริ่มต้นครับ

**Q: Skip กับ Dense ต่างกันอย่างไร?**

Skip (default) จะข้ามเลขอันดับเมื่อมีค่าเสมอ เช่น 1, 2, 2, 2, 5 (ข้าม 3 และ 4)
.
ส่วน Dense จะไม่ข้ามเลข เช่น 1, 2, 2, 2, 3 (ต่อเนื่องกัน)
.
ส่วนตัวผมจะเลือกตาม use case ครับ ถ้าเป็น leaderboard หรือการแข่งขัน ใช้ Skip จะดูเป็นธรรมชาติกว่า แต่ถ้าเป็นระบบคะแนนหรือเกรด Dense จะดูเข้าใจง่ายกว่า 💡

**Q: ควรใช้ RANK หรือ RANKX?**

RANKX มีความ flexible มากกว่าครับ เพราะสามารถใช้ expression ที่ซับซ้อนได้ และควบคุม table context ด้วย ALL/ALLEXCEPT ได้ด้วย
.
ส่วนตัวผมใช้ RANKX เกือบทุกครั้ง เพราะ powerful กว่าและควบคุมได้ง่าย
.
แต่ระวังปัญหา Decimal data type นะครับ ถ้าใช้กับคอลัมน์ Decimal Number ควรใช้ ROUND function หรือเปลี่ยนเป็น Fixed Decimal Number ก่อน มิฉะนั้นอาจได้ผลลัพธ์แปลกๆ 😅

**Q: RANKX กับ TOPN ใช้ร่วมกันอย่างไร?**

RANKX ใช้คำนวณอันดับของทุกรายการ ส่วน TOPN ใช้กรองเฉพาะ N รายการอันดับบนสุด
.
มักใช้ร่วมกันโดย RANKX คำนวณอันดับก่อน แล้ว filter ด้วยเงื่อนไข RANKX

**Q: RANKX ทำงานอย่างไรกับ BLANK values?**

BLANK values ถูกแปลงเป็น 0 (สำหรับตัวเลข) หรือ empty text (สำหรับข้อความ) ก่อนจัดอันดับ
.
ดังนั้น BLANK จะได้อันดับต่ำสุดใน DESC order หรืออันดับสูงสุดใน ASC order
.
ถ้าไม่อยากให้ BLANK ถูกจัดอันดับ ต้องใช้ FILTER เอาออกก่อนครับ หรือใช้ IF statement ในการแสดงผล 📝

**Q: ทำไมต้องระวัง Decimal Number data type?**

นี่เป็นปัญหาเทคนิคที่น้อยคนรู้แต่สำคัญมากครับ 😅 Decimal Number ใช้ floating-point representation (IEEE 754) ซึ่งมีปัญหาความแม่นยำในการเปรียบเทียบค่าเท่ากัน (==)
.
ทำให้ RANKX อาจให้ผลลัพธ์ไม่คาดคิดกับค่าที่ดูเหมือนเท่ากัน เช่นอาจได้อันดับ 1, 2, 3 แทนที่จะเป็น 1, 1, 3
.
แก้ไขโดยใช้ Fixed Decimal Number data type หรือใช้ ROUND function ก่อนส่งเข้า RANKX ส่วนตัวผมแนะนำให้ใช้ ROUND เลยครับ ปลอดภัยกว่า 💡

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

- [ALL – ลบ Filter หรือคืนค่าทุกแถว](https://www.thepexcel.com/functions/dax/filter/all-dax/)
- [ALLSELECTED – ลบตัวกรอง Visual แต่คง Slicer เพื่อสร้าง Visual Total](https://www.thepexcel.com/functions/dax/filter/allselected-dax/)
- [ALLEXCEPT – ล้างตัวกรองทั้งหมดยกเว้นคอลัมน์ที่ระบุ](https://www.thepexcel.com/functions/dax/filter/allexcept-dax/)
- [TOPN – คืนตาราง Top N ตามนิพจน์การเรียงลำดับ](https://www.thepexcel.com/functions/dax/table-manipulation/topn-dax/)
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- [CALCULATE – ฟังก์ชันหลักของ DAX ที่ควบคุม Filter Context](https://www.thepexcel.com/functions/dax/filter/calculate-dax/)
- [SUMX – Iterator Function สำหรับคำนวณผลรวมแบบ Row-by-Row ใน DAX](https://www.thepexcel.com/functions/dax/aggregation/sumx-dax/)
- [VALUES – ดึงค่าที่ไม่ซ้ำจากคอลัมน์ (รวม Blank จากข้อผิดพลาดความสัมพันธ์)](https://www.thepexcel.com/functions/dax/table-manipulation/values-dax/)
- round-dax
- [DIVIDE – ฟังก์ชัน DAX](https://www.thepexcel.com/functions/dax/math-and-trig/divide-dax/)
- [COUNTROWS – นับจำนวนแถวในตารางและเทบิลเสมือน](https://www.thepexcel.com/functions/dax/aggregation/countrows-dax/)
- rank-dax
- [FIXED – แปลงตัวเลขเป็นข้อความพร้อมกำหนดทศนิยม/คอมมา](https://www.thepexcel.com/functions/dax/text/fixed-dax/)

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

- [Microsoft Learn: RANKX function](https://learn.microsoft.com/en-us/dax/rankx-function-dax) _(documentation)_
- [DAX Guide: RANKX](https://dax.guide/rankx/) _(documentation)_
- [SQLBI: Using RANKX in DAX](https://www.sqlbi.com/articles/using-rankx-in-dax/) _(guide)_
- [SQLBI: Ranking Patterns in DAX](https://www.sqlbi.com/articles/ranking-patterns-in-dax/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/statistical/rankx-dax/](https://www.thepexcel.com/functions/dax/statistical/rankx-dax/)_
