# Rank - 图表函数

Rank() 用于在表达式中计算图表的行数，并且对于每一行显示在表达式中计算的维度值的相对位置。当计算表达式的值时，该函数将结果与包含当前列片段的其他行的结果比较，然后返回片段中当前行的排名。

[Rank function](https://play.vidyard.com/21eZKs36KWVQPaL6nxT9Tt)

列段数据

列段数据

列段数据 ![显示列段数据的表格](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Resources/Images/table_column_segments.png)

对于非表格图表，将定义当前列段数据，就像显示在图表的垂直表等同物中一样。

语法：

Rank([TOTAL] expr[, mode[, fmt]])

返回数据类型： 双

参数：

参数

| 参数 | 说明 |
| --- | --- |
| expr | 表达式或字段包含要度量的数据。 |
| mode | 指定函数结果的数字呈现形式。 |
| fmt | 指定函数结果的文本呈现形式。 |
| TOTAL | 如果图表是一维或如果表达式前面有 TOTAL 限定符，则该函数用于评估整列。 如果表格或表格等同物有多个垂直维度，当前列段数据将只包括值与所有维度列的当前行相同的行，但按内部字段排序显示最后维度的列除外。<br><br>[定义聚合范围](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/define-aggregation-scope.htm) |

排行以双重值形式返回，在每一行拥有一个唯一排行的情况下，排行是一个介于 1 和当前列段数据行数之间的整数。

当多行共享同一个排名时，文本和数字呈现形式可使用 mode 和 fmt 参数进行控制。

###### mode

第二个参数 mode 可获取以下值：

modemode 示例

| 值 | 描述 |
| --- | --- |
| 0（默认） | 如果共享组中的全部排行处在整个排行中间值的下半部分，全部行都获得共享组的最低排行。<br><br>如果共享组中的全部排行处在整个排行中间值的上半部分，全部行都获得共享组的最高排行。<br><br>如果共享组中的排行跨越整个排行的中间值，全部行都获得整个列片断中最高和最低排行的平均值。 |
| 1 | 全部行的最低排行。 |
| 2 | 全部行的平均排行。 |
| 3 | 全部行的最高排行。 |
| 4 | 第一行的最低排行，然后每一行都提高一位。 |

###### fmt

第三个参数 fmt 可获取以下值：

fmtfmt示例

| 值 | 描述 |
| --- | --- |
| 0（默认） | 全部行中的低值 - 高值（如 3 - 4）。 |
| 1 | 全部行的高值。 |
| 2 | 第一行的低值，以后各行都为空白。 |

mode 4 和 fmt 2 的行顺序由图表维度的排序决定。

示例和结果：

从维度 Product 和 Sales 创建两个可视化，从 Product 和 UnitSales 创建另一个可视化。添加度量，如下表所示。

排名示例

| 示例 | 结果 |
| --- | --- |
| 示例 1。创建一个表格，维度为 `Customer` 和 `Sales`、度量为 `Rank(Sales)` | 结果取决于维度的排序顺序。如果按 Customer 对表格排序，表格会列出 Astrida 的所有 Sales 值，然后列出 Betacab 的所有同类型值，以此类推。 Sales 值为 12 的 Rank(Sales) 结果将显示 10，Sales 值为 13 的相同字段结果将显示 9，以此类推，并且对 Sales 值为 78 的排行值返回 1。下一个列段数据从 Betacab 开始，在此列段数据中其第一个 Sales 值是 12。此字段的排行值 Rank(Sales) 显示为 11。<br><br>如果此表格按 Sales 排序，则列段数据包含 Sales 值以及相应的 Customer。因为有两个 Sales 值是 12（对于 Astrida 和 Betacab），因此该列段数据每个 Customer 值的 Rank(Sales) 值都是 1-2。这是因为有两个 Customer 值的 Sales 值都是 12。如果有 4 个值，则所有行的结果都是 1-4。这显示了使用参数 fmt 默认值 (0) 时的结果。 |
| 示例 2。将维度 Customer 替换为 Product，并添加度量 `Rank(Sales,1,2)` | 这样将在每个列段数据的第一行中返回 1，并将所有其他行留空，因为参数 mode 和 fmt 分别设置为 1 和 2。 |

示例 1 的结果，按 Customer 对表格排序：

结果表

| Customer | Sales | Rank(Sales) |
| --- | --- | --- |
| Astrida | 12 | 10 |
| Astrida | 13 | 9 |
| Astrida | 20 | 8 |
| Astrida | 22 | 7 |
| Astrida | 45 | 6 |
| Astrida | 46 | 5 |
| Astrida | 60 | 4 |
| Astrida | 65 | 3 |
| Astrida | 70 | 2 |
| Astrida | 78 | 1 |
| Betcab | 12 | 11 |

示例 1 的结果，按 Sales 对表格排序：

结果表

| Customer | Sales | Rank(Sales) |
| --- | --- | --- |
| Astrida | 12 | 1-2 |
| Betacab | 12 | 1-2 |
| Astrida | 13 | 1 |
| Betacab | 15 | 1 |
| Astrida | 20 | 1 |
| Astrida | 22 | 1-2 |
| Betacab | 22 | 1-2 |
| Betacab | 24 | 1-2 |
| Canutility | 24 | 1-2 |

` `

示例中所使用的数据：

`ProductData:` `Load * inline [` `Customer|Product|UnitSales|UnitPrice` `Astrida|AA|4|16` `Astrida|AA|10|15` `Astrida|BB|9|9` `Betacab|BB|5|10` `Betacab|CC|2|20` `Betacab|DD|0|25` `Canutility|AA|8|15` `Canutility|CC|0|19` `] (delimiter is '|');` ` ``Sales2013:``crosstable (Month, Sales) LOAD * inline [``Customer|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec``Astrida|46|60|70|13|78|20|45|65|78|12|78|22``Betacab|65|56|22|79|12|56|45|24|32|78|55|15``Canutility|77|68|34|91|24|68|57|36|44|90|67|27``Divadip|57|36|44|90|67|27|57|68|47|90|80|94``] (delimiter is '|');`` `

## 了解详情

* [Sum - 图表函数](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/BasicAggregationFunctions/sum.htm)