Disclaimer: This is work in progress intended to consolidate information from various sources for learning purposes. For the latest information please consult the documentation (see the links below)!
⇐ ⇒
Context enables you to
Last updated: 26-Oct-2026
[DAX] Context
- {def} the set of data that a calculation, visual, or DAX expression evaluates at a given moment
- determines which rows are considered when a calculation is evaluated
- the same measure can return different results depending on the context
- enables users to perform dynamic analysis [5]
- used by measures, calculated columns/tables, iterator functions, slicers & filters, relationships, time intelligence, RLS, etc.
- {concept} evaluation context
- {def} the set of conditions and rules that determines which data is used when a DAX formula calculates a result
- both the row context and the filter context contribute to the evaluation context [3]
- the two are very different, serving different purposes, having different features and different behaviors [3]
- {type} filter context
- {def} the set of filters that are active when a calculation is evaluated
- determines which rows of data are visible to a measure at any given moment [2]
- applies or removes filters to/from tables in the semantic model [2]
- filters tables in a model [2]
- propagates filters through relationships [2]
- managed by CALCULATE [2]
- sources
- visuals (charts, tables, cards, etc.)
- slicers
- report/page filters
- cross-filtering from other visuals
- DAX functions
- e.g. CALCULATE(), CALCULATETABLE()
- {type} row context
- {def} the context in DAX where an expression is evaluated for a single row at a time, giving DAX access to the values of the current row
- aka 'the current row'
- used when Power BI is evaluating one row at a time [1]
- needed to obtain the value of a column for a certain row [2]
- {warning} trying to access the value of a column in a measure without an active row context results in an error [2]
- exists whenever we create a calculated column or whenever we are computing an expression inside an iteration [2]
- calculated columns have an automatic row context [2]
- measures don't have a row context [2]
- if is needed to evaluate an expression row by row inside a measure, is needed to start an iteration to create a row context [2]
- when using iterators, the developer is responsible for creating and handling the row context [2]
- iterates over a table and evaluate its column values [2]
- ⇐ one row at a time
- row context is the result of iterating over rows
- row context equals iteration [2] is not exactly a correct statement
- means that DAX evaluates expressions one row at a time
- during the iteration, DAX creates a row context that gives the formula access to the values of the current row
- functions like SUMX and calculated columns rely on this behavior
- the two aren't identical
- iteration refers to the process of moving through rows
- row context is knowledge of the current row during that process
- DAX creates a row context for the current row
- functions like a cursor [2]
- during an iteration, it points to a specific row of the table being iterated, telling the DAX formula which row is currently to be considered [2]
- it does not filter [2][3]
- it simply indicates to DAX which row is currently responsible for providing the values to perform the calculation and where the result of the calculation should go [3]
- it's irrelevant whether a column in the table is used in a particular calculation [3]
- all columns of the table are part of the row context when a calculation is performed [3]
- encountered when (aka created via)
- calculated columns
- the formula defines a calculated column [2]
- iterators
- perform active iteration over a table [2]
- e.g. SUMX, FILTER, ADDCOLUMNS, etc.
- scans the table row by row, and during the iteration, the row context points to the current row [2]
- the row context is needed to obtain the value of a column for a certain row [2]
- iterator functions create row context while moving through rows
- help create multiple nested row contexts [2]
- increases the complexity of the code [2]
- can transform into filter context through a mechanism called context transition [3]
- defines the value of a column by providing the exact row [2]
- calculated columns are always executed in a row context [2]
- is not the case for measures [2]
- {limitation} doesn't propagate filters through relationships from one table to another [2]
- {recommendation} use RELATED and RELATEDTABLE to direct and move the row context from one table over to another [2]
- {limitation} does not place any filter [2]
- {concept} context transition
- occurs when a row context is converted into a filter context [1]
- takes any active row context and transforms it into a filter in the filter context [3]
- requires an active row context [2]
- either CALCULATE is executed or a measure is invoked [2]
- implies a context transition in these conditions [2]
- the row context is transformed into an equivalent filter context [2]
- usually the context transition happens because a measure is being invoked rather than because of an explicit CALCULATE [2]
- leveraging the context transition leads to better code [2]
- without context transition DAX can only see the current row
- with context transition, DAX can use values from the current row to filter entire tables and compute aggregations
- the process is automatically execute by CALCULATE and CALCULATETABLE [2]
- any statement invoking either of these two functions performs a context transition [2]
- this happens regardless of whether [2]
- the functions functions were written explicitly [2]
- CALCULATE or CALCULATETABLE is used explictely [2]
- a function that conveniently hides CALCULATE or CALCULATETABLE functions from users but still invokes them [2]
- e.g. TOTALYTD
- this happens in calculated columns, whenever [2]
- a row context is present
- a function that iterates over multiple values is used (aka iterators)
- SUMX
- [measures] whenever a measure is invoked, the context transition happens immediately before the measure starts being executed, as if CALCULATE automatically surrounds the measure [2]
- {benefit} opens new ways to optimize the code [2]
- eliminates complex lookup logic
- reduces repeated filtering
- leverages relationships
- enables reusable measures
- improves performance with the storage engine
- pushes work toward the VertiPaq storage engine
- ⇐ highly optimized for aggregations
- {concept} visual calculation [>>]
- {def} DAX calculation that runs directly on a specific visual (table, matrix, chart, etc.) [3]
- {concept} visual calculation context
- context used by visual calculations, where calculations are performed after the visual has already been built
- uses the rows and columns that are visible in the visual itself rather than directly querying the underlying model
- allows users to calculate running totals, moving averages, differences, rankings, and other analyses directly within a visual
References:
[1] Greg Deckler & Brett Powell (2024) "Microsoft Power BI Cookbook: Convert raw data into business insights with updated techniques, use cases, and best practices" 3rd Ed.
[2] Alberto Ferrari & Marco Russo (2025) The Definitive Guide to DAX: Mastering the semantic model expression language for Microsoft Power BI, Fabric and Excel
[3] Jeroen ter Heerdt et al (2026) "Microsoft Power BI Visual Calculations: Simplifying DAX"
[4] Microsoft Learn (2026) Modify DAX filter context in semantic models [link]
[5] Microsoft Support (202?) Context in DAX Formulas [link]
[6] Microsoft Fabric Community Row vs Filter Context: a Visual Guide [link]
Acronyms:
DAX - Data Analysis eXpressions
DAX - Data Analysis eXpressions
RLS - Row Level Security

No comments:
Post a Comment