Summary of the INDEX Function
The INDEX function in Tableau is a powerful table calculation that returns the position of a mark within the current partition. It is particularly useful for tasks such as row numbering, ranking layouts, pagination, and conditional display logic. Unlike SQL row numbers or calculated fields, INDEX is influenced by the view, sorting, and partitioning, leading to different behaviors based on the worksheet’s structure.

Problem Definition: The Need for Row Numbering in Visualizations
In reporting, there are often scenarios where numbering items based on their appearance in a visualization is necessary. Common questions include:
- What is the first transaction in each customer group?
- Which rows should be displayed on page one of a table?
- How do we label the top ten products after sorting the view?
- How can we create alternating row logic in a dashboard table?
These challenges are not straightforward aggregation problems. The results depend on the structure of the view, meaning that the same row can occupy different positions based on sorting, partitioning, or filtering.
This is where the INDEX function becomes invaluable.
Key Concept: How INDEX Works
The INDEX function returns the position of a mark within a partition. A partition is defined as the set of marks that Tableau evaluates together in a table calculation.
In practical terms:
- The first mark in the partition receives a value of 1.
- The second mark receives a value of 2.
- The third mark receives a value of 3.
- And so forth.
It is important to note that INDEX does not describe the data itself; rather, it describes the order of marks in the current table calculation result. This makes it particularly useful when you need a relative position within a visualization rather than a value stored in the source data.
Data Example: Using INDEX with a Sales Table
Consider the following simple sales table:
| OrderID | Customer | Product | Sales |
|---|---|---|---|
| 1 | A | Bike | 100 |
| 2 | A | Helmet | 50 |
| 3 | B | Bike | 200 |
| 4 | B | Gloves | 25 |
| 5 | C | Bike | 300 |
If we create a table with Product and Sales, Tableau may display the products in a sorted order:
| Product | Sales |
|---|---|
| Bike | 600 |
| Helmet | 50 |
| Gloves | 25 |
When INDEX is applied to this view, the rows are numbered according to their displayed order:
| Product | Sales | INDEX |
|---|---|---|
| Bike | 600 | 1 |
| Helmet | 50 | 2 |
| Gloves | 25 | 3 |
If the sort order changes, the INDEX values will also change. This is a crucial point: INDEX follows the visible order in the worksheet, not the original row order in the source table.
Tool Implementation: How to Use INDEX in Tableau
What INDEX Is in Tableau
In Tableau, INDEX is a table calculation that returns the current row position in the partition.
Syntax:
INDEX()
This function does not take any arguments, which can be surprising for developers who expect to pass a dimension or measure into the function. Instead, INDEX reads the structure of the table after Tableau has built the view.
Common Setup for INDEX
To effectively use INDEX, consider the following setup:
- Sort the view to control the numbering.
- Set the table calculation direction.
- Define the partition so Tableau knows which marks belong together.
A typical use case looks like this:
INDEX()
Tableau will then assign numbers based on the layout of the view.
Applied Example: Numbering Customers by Total Sales
Suppose we want to number customers based on their total sales in descending order. We create a view with Customer and SUM(Sales):
| Customer | SUM(Sales) |
|---|---|
| C | 300 |
| B | 225 |
| A | 150 |
Next, we add:
INDEX()
The result will be:
| Customer | SUM(Sales) | INDEX |
|---|---|---|
| C | 300 | 1 |
| B | 225 | 2 |
| A | 150 | 3 |
If the sheet is sorted in ascending order instead, the result will change:
| Customer | SUM(Sales) | INDEX |
|---|---|---|
| A | 150 | 1 |
| B | 225 | 2 |
| C | 300 | 3 |
The underlying data remains unchanged, but the numbering does. This illustrates that INDEX is a display-aware sequence rather than a source-level rank.
Why the INDEX Feature Exists
Default aggregations in Tableau can answer questions such as total sales, average sales, or count of orders. However, they do not provide information about the position of a mark in a view. For instance:
SUM(Sales)
This function gives a numeric total but does not indicate whether a mark is first, second, or fifth in the displayed result.
The INDEX function fills this gap by allowing Tableau to expose the order of marks after the visual structure has been applied. This capability is particularly important in dashboards, where many business questions rely on visible order. Examples include:
- Displaying the first 20 rows in a table.
- Identifying the top item in each segment.
- Selecting the nth item in a sorted list.
- Implementing alternating bands for improved readability.
Important Behavioral Details of INDEX
INDEX is a Table Calculation
The INDEX function is computed after the view is built, which means it depends on:
- Dimensions in the view
- Sort order
- Partitioning
- Table calculation direction
If the view changes, the result can also change.
Filters Can Affect the Result
Since INDEX operates on the marks that remain in the view, filters can alter the numbering. If a row is filtered out, the remaining rows will be renumbered. This is crucial for analysts who expect a stable row position, as INDEX does not guarantee stability.
Sorting Changes INDEX
The sort order directly impacts the output of INDEX. If a field is sorted in descending order, INDEX will start at the first displayed mark in that order. Changing the sort will also change the sequence.
Partitioning Controls Scope
If the calculation is partitioned by Customer, INDEX will restart for each customer group. Conversely, if it is computed across the entire table, the numbering will continue through all displayed marks. This distinction is critical, as many implementation issues arise from using the wrong addressing settings.
INDEX is Not the Same as ROW_NUMBER in SQL
SQL row numbering is typically based on a query order and a defined window specification. In contrast, INDEX is based on the Tableau worksheet. This means that the same dataset can yield different results in different views.
INDEX Can Be Used with FIRST and SIZE
INDEX is often paired with other table calculations. Examples include:
- Displaying only the first ten marks using
INDEX() <= 10 - Creating alternating row logic using
INDEX() % 2 - Referencing row position in dynamic display logic
These patterns rely on the same principle: the expression evaluates after Tableau has established the mark order.
Real Usage Patterns for INDEX
Common use cases for the INDEX function include:
- Row numbering in tables
- Top N display logic
- Pagination-style views
- Alternating row shading
- Ranking support in dashboard tables
- First or last item selection
- Debugging table calculation order
INDEX is especially beneficial when the calculation needs to align with what the user sees, rather than what is stored in the data source.
Conclusion
In summary, the INDEX function is a versatile tool in Tableau that allows users to understand and manipulate the order of marks within a visualization. By grasping its behavior and implementation, analysts can effectively address complex reporting challenges that depend on visible order.