The second year of the pandemic is coming to a close and despite the many uncertainties, we are all striving to push forward and look ahead. For sure, it is a good moment to see what happened in the DAX world.

New DAX functions in 2021

Microsoft released 8 new DAX functions, plus several other undocumented functions to support composite models. The 8 documented functions are:

  • ISAFTER : this is a small variation of the ISONORAFTER function.
  • HASH : computes a hash over one or more expressions passed as arguments.
  • NAMEOF : returns the fully-qualified name of a column or measure reference.
  • BITAND : bitwise AND of two numbers.
  • BITOR : bitwise OR of two numbers.
  • BITXOR : bitwise XOR of two numbers.
  • BITLSHIFT : returns a number shifted left by the specified number of bits.
  • BITRSHIFT : returns a number shifted right by the specified number of bits.

There were another three important events for the DAX world:

  1. Daniel Otykier released Tabular Editor 3, which includes the most productive DAX editor in the world. Any professional developer should use a version of Tabular Editor for the reasons described in Development tools for Tabular models in 2021.
  2. Microsoft simplified the syntax required to create multi-column filters in CALCULATE, as described in Specifying multiple filter conditions in CALCULATE.
  3. Power BI Desktop now supports the Detail Rows Expression property required by the drillthrough feature in Excel PivotTables. You can see how to use this feature in Controlling drillthrough in Excel PivotTables connected to Power BI or Analysis Services.

After one year, the composite models – whose official name is DirectQuery for Power BI datasets and Analysis Services – are still in preview. There have been many improvements, but the feature is still not ready for production. In the meantime, we worked on content about composite models (and much else) that we will publish in 2022.

What SQLBI delivered in 2021

Being unable to plan in-person events, we redirected these resources towards long-term investments. Some have already been presented to you in 2021 and others will be delivered in the following years.

What’s coming in 2022

The best part is always what’s next:

  • Courses: Our priority is a new version of Optimizing DAX, while keeping other courses updated when new features are released in general availability. We are also working on additional content for professional Tabular model authors – we cannot share many details yet, but you should see something new in the first months of 2022.
  • DAX Debugger: Daniel Otykier announced a new DAX Debugger feature for Tabular Editor 3. This will be a game-changer also for people teaching or learning DAX. You can watch the presentation made a couple of weeks ago, or just wait for the first preview in January 2022.
  • Tools: in 2020, SQLBI started investing in new tools that did not end up seeing the light in 2021. The only reason for this is that we never compromise on quality. However, 2022 is the year for these new tools from SQLBI. Stay tuned.
  • Content: last but not least… More articles, more videos, more content.

If you want to receive regular updates about SQLBI, go ahead: register to our newsletter and subscribe to our YouTube channel.

We look forward to farther serving your development in 2022!


Returns true if the list of Value1 parameters compares strictly after the list of Value2 parameters.

ISAFTER ( <Value1>, <Value2> [, [<Order>] [, <Value1>, <Value2> [, [<Order>] [, … ] ] ] ] )


The IsOnOrAfter function is a boolean function that emulates the behavior of Start At clause and returns true for a row that meets all the conditions mentioned as parameters in this function.

ISONORAFTER ( <Value1>, <Value2> [, [<Order>] [, <Value1>, <Value2> [, [<Order>] [, … ] ] ] ] )


Compute hash over a variable number of input expressions and return a value.

HASH ( <Expression> [, <Expression> [, … ] ] )


Returns the name of a column or measure.

NAMEOF ( <Value> )


Returns a bitwise ‘AND’ of two numbers.

BITAND ( <Number1>, <Number2> )


Checks whether all arguments are TRUE, and returns TRUE if all arguments are TRUE.

AND ( <Logical1>, <Logical2> )


Returns a bitwise ‘OR’ of two numbers.

BITOR ( <Number1>, <Number2> )


Returns TRUE if any of the arguments are TRUE, and returns FALSE if all arguments are FALSE.

OR ( <Logical1>, <Logical2> )


Returns a bitwise ‘XOR’ of two numbers.

BITXOR ( <Number1>, <Number2> )


Returns a number shifted left by the specified number of bits.

BITLSHIFT ( <Number>, <ShiftAmount> )


Returns a number shifted right by the specified number of bits.

BITRSHIFT ( <Number>, <ShiftAmount> )

Context transition

Evaluates an expression in a context modified by filters.

CALCULATE ( <Expression> [, <Filter> [, <Filter> [, … ] ] ] )