Stay Ahead, Stay ONMINE

How to Develop Complex DAX Expressions

At some point or another, any Power BI developer must write complex Dax expressions to analyze data. But nobody tells you how to do it. What’s the process for doing it? What is the best way to do it, and how supportive can a development process be? These are the questions I will answer here. Introduction  Sometimes my clients ask me how I came up with the solution for a specific measure in DAX. My answer is always that I follow a specific process to find a solution.  Sometimes, the process is not straightforward, and I must deviate or start from scratch when I  see that I have taken the wrong direction.  But the development process is always the same:  1. Understand the requirements.  2. Define the math to calculate the result.  3. Understand if the measure must work in any or one specific scenario. 4. Start with intermediary results and work my way step-by-step until I fully understand how it should work and can deliver the requested result.  5. Calculate the final result.  The third step is the most difficult.  Sometimes my client asks me to calculate a specific result in a particular scenario. But after I ask again, the answer is: Yes, I will also use it in other scenarios.  For example, some time ago, a client asked me to create some measures for a specific scenario in a report. I had to do it live during a workshop with the client’s team.  Days after I delivered the requested results, he asked me to create another report based on the same semantic model and logic we elaborated on during the workshop, but for a more flexible scenario.  The first set of measures was designed to work tightly with the first scenario, so I didn’t want to change them. Therefore, I created a new set of more generic measures.  Yes, this is a worst-case scenario, but it is something that can happen.  This was just an example of how important it is to take some time to thoroughly understand the needs and the possible future use cases for the requested measures.  Step 1: The requirements  For this piece, I take one measure from my previous article to calculate the linear extrapolation of my customer count.  The requirements are: Use the Customer Count Measure as the Basis Measure.  The user can select the year to analyze.  The user can select any other dimension in any Slicer.  The User will analyze the result over time per month.  The past Customer Count should be taken as the input values.  The YTD growth rate must be used as the basis for the result.  Based on the YTD growth rate, the Customer Count should be extrapolated to the end of  the year.  The YTD Customer Count and the Extrapolation must be shown on the same Line-Chart. The result should look like this for the year 2022:  Figure 1 – Requested result for the linear extrapolation of the Customer Count (Figure by the Author)  OK, let’s look at how I developed this measure. But before doing so, we must understand what the filter context is.  If you are already familiar with it, you can skip this section. Or you can read it anyway to ensure we are at the same level.  Interlude: The filter context  The filter context is the central concept of DAX.  When writing measures in a semantic model, whether in Power Bi, a fabric semantic model, or an analysis services semantic model, you must always understand the current filter context.  The filter context is:  The sum of all Filters which affect the result of a DAX expression.  Look at the following picture: Figure 2 – Ask yourself: What is the Filter Context of the marked cells? (Figure by the Author) Can you explain the Filter Context of the marked cells?  Now, look at the following picture:  Figure 3 – All the Filters that affect the Filter Context of the marked cells (Figure by the Author)  There are six filters, that affect the filter context of the marked cells for the two measures “Sum Retail Sales” and “Avg Retail Sales”:  The Store “Contoso Paris Store”  The City “Paris”  The ClassName “Economy”  The Month of April 2024  The Country “France”  The Manufacturer “Proseware Inc.”  The first three filters come from the visual. We can call them “Internal Filters”. They control how the Matrix-Visual can expand and how many details we can see.  The other filters are “External Filters”, which come from the Slicers or the Filter Pane in Power BI  and are controlled by the user.  The Power of DAX Measures lies in the possibility of extracting the value of the Filter Context and the capability of manipulating the Filter context.  We do this when writing DAX expressions: We manipulate the filter context. Step 2: Intermediary results  OK, now we are good to go.  First, I do not start with the Line-Visual, but with a Table or a Matrix Visual.  This is because it’s easier to see the result as a number than a line.  Even though a linear progression is visible only as a line.  However, the intermediary results are better readable in a Matrix.  If you are not familiar with working with Variables in DAX, I recommend reading this piece, where  I explain the concepts for Variables:  The next step is to define the Base Measure. This is the Measure we want to use to calculate the intended Result.  As we want to calculate the YTD result, we can use a YTD Measure for the Customer Count:  Online Customer Count YTD = VAR YTDDates = DATESYTD(‘Date'[Date]) RETURN CALCULATE( DISTINCTCOUNT(‘Online Sales'[CustomerKey]) ,YTDDates ) Now we must consider what to do with these intermediary results.  This means that we must define the arithmetic of the Measure.  For each month, I must calculate the last known Customer Count YTD.  This means, I always want to calculate 2,091 for each month. This is the last YTD Customer  Count for the year 2022.  Then, I want to divide this result by the last month with Sales, in this case 6, for June. Then multiply it by the current month number.  Therefore, the first intermediary result is to know when the last Sale was made. We must get the latest date in the Online Sales table for this.  According to the requirements, the User can select any year to analyze, and the result must be calculated monthly.  Therefore, the correct definition is: I must first know the month when the last sale was made for the selected year.  The Fact table contains a date and a Relationship to the Date table, which includes the month number (Column: [Month]). So, the first variable will be something like this:  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) RETURN LastMonthWithData This is the result:  Figure 4 – Get the last month with Sales (Figure by the Author)  Hold on: We must always get the last month with sales. As it is now, we always get the same month as the Month of the current row.  This is because each row has the Filter Context set to each month.  Therefore, we must remove the Filter for the Month, while retaining the Year. We can do this with ALLEXCEPT():  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = CALCULATE(MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ) RETURN LastMonthWithData Now, the result looks much better: Figure 5 – Last month with Sales calculated for all months (Figure by the Author)  As we calculate the result for each month, we must know the month number of the current row (Month). We will reuse this as the factor for which we multiply the Average to get the linear extrapolation.  The next intermediary result is to get the Month number:  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = CALCULATE(MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ) // Get the last month // Is needed if we are looking at the data at the year, semester, or quarter level VAR MaxMonth = MAX(‘Date'[Month]) RETURN MaxMonth I can leave the first Variable in place and only use the MaxMonth variable after the return. The result shows the month number per month: Figure 6 – Get the current month number per row (Figure by the Author)  According to the definition formulated before, we must get the last Customer Count YTD for the latest month with Sales.  I can do this with the following Expression:  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = CALCULATE(MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ) // Get the last month // Is needed if we are looking at the data at the year, semester, or quarter level VAR MaxMonth = MAX(‘Date'[Month]) // Get the Customer Count YTD VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD] ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ,’Date'[Month] = LastMonthWithData ) RETURN LastCustomerCountYTD As expected, the result shows 2,091 for each month: Figure 7 – Calculating the latest Customer Count YTD for each month (Figure by the Author)  You can see why I start with a table or a Matrix when developing complex Measures.  Now, imagine that one intermediary result is a date or a text.  Showing such a result in a line visual will not be practical.  We are ready to calculate the final result according to the mathematical definition above.  Step 3: The final result  We have two ways to calculate the result:  1. Write the expression after the RETURN statement.  2. Create a new Variable “Result” and use this Variable after the RETURN statement. The final Expression is this:  (LastCustomerCountYTD / LastMonthWithData) * MaxMonth The first Variant looks like this:  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = CALCULATE(MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ) // Get the last month // Is needed if we are looking at the data at the year, semester, or quarter level VAR MaxMonth = MAX(‘Date'[Month]) // Get the Customer Count YTD VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD] ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ,’Date'[Month] = LastMonthWithData ) RETURN // Calculating the extrapolation (LastCustomerCountYTD / LastMonthWithData) * MaxMonth This is the second Variant:  Linear extrapolation Customer Count YTD trend = // Get the number of months since the start of the year VAR LastMonthWithData = CALCULATE(MAXX(‘Online Sales’ ,RELATED(‘Date'[Month]) ) ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ) // Get the last month // Is needed if we are looking at the data at the year, semester, or quarter level VAR MaxMonth = MAX(‘Date'[Month]) // Get the Customer Count YTD VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD] ,ALLEXCEPT(‘Date’, ‘Date'[Year]) ,’Date'[Month] = LastMonthWithData ) // Calculating the extrapolation VAR Result = (LastCustomerCountYTD / LastMonthWithData) * MaxMonth RETURN Result The result is the same.  The second variant allows us to quickly switch back to the Intermediary results if the final result  is incorrect without needing to set the expression after the RETURN statement as a comment.  It simply makes life easier.  But it’s up to you which variant you like more.  The result is this: Figure 8 – Final result in a table (Figure by the Author)  When converting this table to a Line Visual, we get the same result as in the first figure. The last step will be to set the line as a Dashed line, to get the needed visualization. Figure 9 – Set the line for the extrapolation as a dashed line (Figure by the Author)  Complex calculated columns  The process is the same when writing complex DAX expressions for calculated columns. The difference is that we can see the result in the Table View of Power BI Desktop.  Be aware that when calculated columns are calculated, the results are physically stored in the table when you press Enter.  The results of Measures are not stored in the Model. They are calculated on the fly in the Visualizations.  Another difference is that we can leverage Context Transition to get our result when we need it to depend on other rows in the table.  Read this piece to learn more about this fascinating topic:  Conclusion  The development process for complex expressions always follows the same steps:  1. Understand the requirements – Ask if something is unclear.  2. Define the math for the results.  3. Start with intermediary results and understand the results.  4. Build on the intermediary results one by one – Do not try to write all in one step. 5. Decide where to write the expression for the final result.  Following such a process can save you the day, as you don’t need to write everything in one step.  Moreover, getting these intermediary results allows you to understand what’s happening and explore the Filter Context.  This will help you learn DAX more efficiently and build even more complex stuff.  But, be aware: Even though a certain level of complexity is needed, a good developer will keep it as simple as possible, while maintaining the least amount of complexity.  References  Here is the article mentioned at the beginning of this piece, to calculate the linear interpolation. Like in my previous articles, I use the Contoso sample dataset. You can download the  ContosoRetailDW Dataset for free from Microsoft here. The Contoso Data can be freely used under the MIT License, as described here. I changed the dataset to shift the data to contemporary dates.

At some point or another, any Power BI developer must write complex Dax expressions to analyze data. But nobody tells you how to do it. What’s the process for doing it? What is the best way to do it, and how supportive can a development process be? These are the questions I will answer here.

Introduction 

Sometimes my clients ask me how I came up with the solution for a specific measure in DAX. My answer is always that I follow a specific process to find a solution. 

Sometimes, the process is not straightforward, and I must deviate or start from scratch when I  see that I have taken the wrong direction. 

But the development process is always the same: 

1. Understand the requirements. 

2. Define the math to calculate the result. 

3. Understand if the measure must work in any or one specific scenario.

4. Start with intermediary results and work my way step-by-step until I fully understand how it should work and can deliver the requested result. 

5. Calculate the final result. 

The third step is the most difficult. 

Sometimes my client asks me to calculate a specific result in a particular scenario. But after I ask again, the answer is: Yes, I will also use it in other scenarios. 

For example, some time ago, a client asked me to create some measures for a specific scenario in a report. I had to do it live during a workshop with the client’s team. 

Days after I delivered the requested results, he asked me to create another report based on the same semantic model and logic we elaborated on during the workshop, but for a more flexible scenario. 

The first set of measures was designed to work tightly with the first scenario, so I didn’t want to change them. Therefore, I created a new set of more generic measures. 

Yes, this is a worst-case scenario, but it is something that can happen. 

This was just an example of how important it is to take some time to thoroughly understand the needs and the possible future use cases for the requested measures. 

Step 1: The requirements 

For this piece, I take one measure from my previous article to calculate the linear extrapolation of my customer count. 

The requirements are:

  • Use the Customer Count Measure as the Basis Measure. 
  • The user can select the year to analyze. 
  • The user can select any other dimension in any Slicer. 
  • The User will analyze the result over time per month. 
  • The past Customer Count should be taken as the input values. 
  • The YTD growth rate must be used as the basis for the result. 
  • Based on the YTD growth rate, the Customer Count should be extrapolated to the end of  the year. 
  • The YTD Customer Count and the Extrapolation must be shown on the same Line-Chart.

The result should look like this for the year 2022: 

Figure 1 – Requested result for the linear extrapolation of the Customer Count (Figure by the Author) 

OK, let’s look at how I developed this measure.

But before doing so, we must understand what the filter context is. 

If you are already familiar with it, you can skip this section. Or you can read it anyway to ensure we are at the same level. 

Interlude: The filter context 

The filter context is the central concept of DAX. 

When writing measures in a semantic model, whether in Power Bi, a fabric semantic model, or an analysis services semantic model, you must always understand the current filter context. 

The filter context is: 

The sum of all Filters which affect the result of a DAX expression. 

Look at the following picture:

Figure 2 – Ask yourself: What is the Filter Context of the marked cells? (Figure by the Author) Can you explain the Filter Context of the marked cells? 

Now, look at the following picture: 

Figure 3 – All the Filters that affect the Filter Context of the marked cells (Figure by the Author) 

There are six filters, that affect the filter context of the marked cells for the two measures “Sum Retail Sales” and “Avg Retail Sales”: 

  • The Store “Contoso Paris Store” 
  • The City “Paris” 
  • The ClassName “Economy” 
  • The Month of April 2024 
  • The Country “France” 
  • The Manufacturer “Proseware Inc.” 

The first three filters come from the visual. We can call them “Internal Filters”. They control how the Matrix-Visual can expand and how many details we can see. 

The other filters are “External Filters”, which come from the Slicers or the Filter Pane in Power BI  and are controlled by the user. 

The Power of DAX Measures lies in the possibility of extracting the value of the Filter Context and the capability of manipulating the Filter context. 

We do this when writing DAX expressions: We manipulate the filter context.

Step 2: Intermediary results 

OK, now we are good to go. 

First, I do not start with the Line-Visual, but with a Table or a Matrix Visual. 

This is because it’s easier to see the result as a number than a line. 

Even though a linear progression is visible only as a line. 

However, the intermediary results are better readable in a Matrix. 

If you are not familiar with working with Variables in DAX, I recommend reading this piece, where  I explain the concepts for Variables: 

The next step is to define the Base Measure. This is the Measure we want to use to calculate the intended Result. 

As we want to calculate the YTD result, we can use a YTD Measure for the Customer Count: 

Online Customer Count YTD =
VAR YTDDates = DATESYTD('Date'[Date])
RETURN
CALCULATE(
DISTINCTCOUNT('Online Sales'[CustomerKey])
,YTDDates
)

Now we must consider what to do with these intermediary results. 

This means that we must define the arithmetic of the Measure. 

For each month, I must calculate the last known Customer Count YTD. 

This means, I always want to calculate 2,091 for each month. This is the last YTD Customer  Count for the year 2022. 

Then, I want to divide this result by the last month with Sales, in this case 6, for June. Then multiply it by the current month number. 

Therefore, the first intermediary result is to know when the last Sale was made. We must get the latest date in the Online Sales table for this. 

According to the requirements, the User can select any year to analyze, and the result must be calculated monthly. 

Therefore, the correct definition is: I must first know the month when the last sale was made for the selected year. 

The Fact table contains a date and a Relationship to the Date table, which includes the month number (Column: [Month]).

So, the first variable will be something like this: 

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = MAXX('Online Sales'

,RELATED('Date'[Month])
)

RETURN
LastMonthWithData

This is the result: 

Figure 4 – Get the last month with Sales (Figure by the Author) 

Hold on: We must always get the last month with sales. As it is now, we always get the same month as the Month of the current row. 

This is because each row has the Filter Context set to each month. 

Therefore, we must remove the Filter for the Month, while retaining the Year. We can do this with ALLEXCEPT()

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = CALCULATE(MAXX('Online Sales'
,RELATED('Date'[Month])
)
,ALLEXCEPT('Date', 'Date'[Year])
)

RETURN
LastMonthWithData

Now, the result looks much better:

Figure 5 – Last month with Sales calculated for all months (Figure by the Author) 

As we calculate the result for each month, we must know the month number of the current row (Month). We will reuse this as the factor for which we multiply the Average to get the linear extrapolation. 

The next intermediary result is to get the Month number: 

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = CALCULATE(MAXX('Online Sales'
,RELATED('Date'[Month])
)
,ALLEXCEPT('Date', 'Date'[Year])
)
// Get the last month
// Is needed if we are looking at the data at the year, semester, or
quarter level
VAR MaxMonth = MAX('Date'[Month])
RETURN
MaxMonth

I can leave the first Variable in place and only use the MaxMonth variable after the return. The result shows the month number per month:

Figure 6 – Get the current month number per row (Figure by the Author) 

According to the definition formulated before, we must get the last Customer Count YTD for the latest month with Sales. 

I can do this with the following Expression: 

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = CALCULATE(MAXX('Online Sales'
,RELATED('Date'[Month])
)
,ALLEXCEPT('Date', 'Date'[Year])
)
// Get the last month
// Is needed if we are looking at the data at the year, semester, or
quarter level
VAR MaxMonth = MAX('Date'[Month])
// Get the Customer Count YTD
VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD]
,ALLEXCEPT('Date', 'Date'[Year])
,'Date'[Month] = LastMonthWithData
)

RETURN
LastCustomerCountYTD

As expected, the result shows 2,091 for each month:

Figure 7 – Calculating the latest Customer Count YTD for each month (Figure by the Author) 

You can see why I start with a table or a Matrix when developing complex Measures. 

Now, imagine that one intermediary result is a date or a text. 

Showing such a result in a line visual will not be practical. 

We are ready to calculate the final result according to the mathematical definition above. 

Step 3: The final result 

We have two ways to calculate the result: 

1. Write the expression after the RETURN statement. 

2. Create a new Variable “Result” and use this Variable after the RETURN statement. The final Expression is this: 

(LastCustomerCountYTD / LastMonthWithData) * MaxMonth

The first Variant looks like this: 

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = CALCULATE(MAXX('Online Sales'
,RELATED('Date'[Month])

)

,ALLEXCEPT('Date', 'Date'[Year])

)
// Get the last month
// Is needed if we are looking at the data at the year, semester, or
quarter level
VAR MaxMonth = MAX('Date'[Month])
// Get the Customer Count YTD
VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD]
,ALLEXCEPT('Date', 'Date'[Year])
,'Date'[Month] = LastMonthWithData
)

RETURN
// Calculating the extrapolation
(LastCustomerCountYTD / LastMonthWithData) * MaxMonth

This is the second Variant: 

Linear extrapolation Customer Count YTD trend =
// Get the number of months since the start of the year
VAR LastMonthWithData = CALCULATE(MAXX('Online Sales'
,RELATED('Date'[Month])
)
,ALLEXCEPT('Date', 'Date'[Year])
)
// Get the last month
// Is needed if we are looking at the data at the year, semester, or
quarter level
VAR MaxMonth = MAX('Date'[Month])
// Get the Customer Count YTD
VAR LastCustomerCountYTD = CALCULATE([Online Customer Count YTD]
,ALLEXCEPT('Date', 'Date'[Year])
,'Date'[Month] = LastMonthWithData
)
// Calculating the extrapolation
VAR Result =
(LastCustomerCountYTD / LastMonthWithData) * MaxMonth
RETURN
Result

The result is the same. 

The second variant allows us to quickly switch back to the Intermediary results if the final result  is incorrect without needing to set the expression after the RETURN statement as a comment. 

It simply makes life easier. 

But it’s up to you which variant you like more. 

The result is this:

Figure 8 – Final result in a table (Figure by the Author) 

When converting this table to a Line Visual, we get the same result as in the first figure. The last step will be to set the line as a Dashed line, to get the needed visualization.

Figure 9 – Set the line for the extrapolation as a dashed line (Figure by the Author) 

Complex calculated columns 

The process is the same when writing complex DAX expressions for calculated columns. The difference is that we can see the result in the Table View of Power BI Desktop. 

Be aware that when calculated columns are calculated, the results are physically stored in the table when you press Enter. 

The results of Measures are not stored in the Model. They are calculated on the fly in the Visualizations. 

Another difference is that we can leverage Context Transition to get our result when we need it to depend on other rows in the table. 

Read this piece to learn more about this fascinating topic: 

Conclusion 

The development process for complex expressions always follows the same steps: 

1. Understand the requirements – Ask if something is unclear. 

2. Define the math for the results. 

3. Start with intermediary results and understand the results. 

4. Build on the intermediary results one by one – Do not try to write all in one step.

5. Decide where to write the expression for the final result. 

Following such a process can save you the day, as you don’t need to write everything in one step. 

Moreover, getting these intermediary results allows you to understand what’s happening and explore the Filter Context. 

This will help you learn DAX more efficiently and build even more complex stuff. 

But, be aware: Even though a certain level of complexity is needed, a good developer will keep it as simple as possible, while maintaining the least amount of complexity. 

References 

Here is the article mentioned at the beginning of this piece, to calculate the linear interpolation.

Like in my previous articles, I use the Contoso sample dataset. You can download the  ContosoRetailDW Dataset for free from Microsoft here.

The Contoso Data can be freely used under the MIT License, as described here. I changed the dataset to shift the data to contemporary dates.

Shape
Shape
Stay Ahead

Explore More Insights

Stay ahead with more perspectives on cutting-edge power, infrastructure, energy,  bitcoin and AI solutions. Explore these articles to uncover strategies and insights shaping the future of industries.

Shape

OpenAI tests Google TPUs amid rising inference cost concerns

Barclays forecasts that chip-related capital expenditure for consumer AI inference alone is expected to approach $120 billion in 2026 and exceed $1.1 trillion by 2028.  Barclays also noted that LLM providers, such as OpenAI, are being forced to look at custom chips, mainly ASICS, instead of GPUs, to reduce the

Read More »

Chronosphere unveils logging package with cost control features

According to a study by Chronosphere, enterprise log data is growing at 250% year-over-year, and Chronosphere Logs helps engineers and observability teams to resolve incidents faster while controlling costs. The usage and volume analysis and proactive recommendations can help reduce data before it’s stored, the company says. “Organizations are drowning

Read More »

Russia’s Sanctioned Arctic LNG 2 Raises Output to Record Levels

Russia’s sanctioned Arctic LNG 2 project raised production to record levels during the last days of June as the facility appears to have resumed loading cargoes. Natural gas output at the Novatek PJSC-led facility averaged 14 million cubic meters a day on June 28 and June 29, according to a person with knowledge of the matter.  That’s the highest daily level for the plant, historic data shows. Higher natural gas output doesn’t automatically indicate a hike in LNG production, but historically the plant produced more gas when it was able to load cargoes. In December 2023, when it was launched, Arctic LNG 2 pumped an average of 13.7 million cubic meters of gas a day. The facility located above the Arctic Circle is key for Russia’s ambition to triple LNG production by 2030. Those plans were squeezed by international restrictions after the invasion of Ukraine, but a liquefied gas tanker appeared to load a cargo several days ago, suggesting Russia may be finding ways around the penalties. Gas output at Arctic LNG 2 averaged 8.9 million cubic meters a day during most of June, compared with 9.4 million cubic meters a day the month before, the person said, asking not to be identified because the information isn’t public. Novatek, the largest shareholder of Arctic LNG 2, and the plant’s operator didn’t immediately respond to requests for comments. The Iris tanker — previously known as North Sky and blacklisted by the US, the EU and the UK — left the site Sunday. Its draft level, which the crew inputs manually, has increased, potentially indicating the tanker loaded a cargo there, according to ship-tracking data compiled by Bloomberg. The tanker is heading toward the Arctic port of Murmansk, where it’s expected to arrive July 2. Novatek uses waters near Murmansk to transfer LNG cargoes

Read More »

Oil Gains as Mideast Tensions Reignite

Oil edged up from near the lowest levels in a month as tensions once again flared in the Middle East, returning the spotlight to the fragility of a truce between Israel and Iran. West Texas Intermediate rose 0.5% to settle near $65.50 a barrel, while Brent closed above $67. Volumes were trending lower ahead of Friday’s July 4 holiday in the US. Investors are watching closely to see whether Iran’s inventories of near-bomb-grade uranium have been depleted and whether its moves to cut off communication with key United Nations watchdog officials will trigger another wave of US strikes. President Donald Trump has said the US will “be there” unless Iran backs away from its nuclear program. So far, the conflict has not disrupted flows in the region but the mere possibility of supply interruptions now has some traders taking a wait-and-see approach. During the heat of tensions, a quarterly record of combined options contracts for WTI and Brent changed hands as traders bet on the outcome of these fast-evolving conflicts, based on data from the exchanges. Aside from geopolitics, macro factors also lent conflicting signals to oil. The demand outlook for the US darkened slightly after factory activity contracted in June for a fourth consecutive month, although the labor market showed signs of strength. The Middle East developments took away the focus from a meeting between the Organization of the Petroleum Exporting Countries and its allies. The group is expected to agree to a fourth monthly major supply increase during discussions Sunday, according to a Bloomberg survey, as de facto leader Saudi Arabia continues its bid to reclaim market share. Oil lost almost 10% last quarter in a volatile three months that saw prices drop sharply in April on Trump’s tariff plans, and surge in June after Israel attacked Iran,

Read More »

Senate passes megabill that curbs IRA tax credits, drops wind and solar tax

Dive Brief: The Senate voted Tuesday to pass an amended version of the Republican budget megabill that significantly curtails clean energy tax credits. It does not contain a proposed excise tax on wind and solar projects that caught many by surprise when it was added late Friday. The final version carves out an exception to the bill’s new phaseout deadline for wind and solar project tax credits. Previously, the legislation stipulated that wind and solar projects had to be placed in service by the end of 2027 to qualify for the clean energy production credit. This was amended to exempt projects that begin construction within a year after the signing of the legislation. The bill that made it out of the Senate Finance Committee had softened some of the IRA cuts made in the House. That version was supplanted over the weekend by harsher language that included the now-dead excise tax. The Senate bill now heads back to the House, with Republican leadership in both chambers aiming to deliver the bill to President Trump’s desk for him to sign it into law by Friday. Dive Insight: Sen. Rand Paul, R-Ky., and Sen. Thom Tillis, R-N.C., continued to oppose the legislation after voting against it over the weekend. They were joined by Sen. Susan Collins, R-Maine, along with all Democrats. Vice President JD Vance provided the tiebreaking vote. “Under the last-minute carveout, Big Green has 12 months to initiate as many subsidized projects as it wants using the insanely-easy-to-meet ‘construction’ threshold,” tweeted fossil fuel advocate Alex Epstein, who helped congressional Republicans shape the megabill. “Several Senators have already told me they didn’t know about or understand this last-minute paragraph. If that’s the case they should do whatever they can to fix the situation.”  Harry Godfrey, who leads Advanced Energy United’s federal policy team, said

Read More »

USA Diesel Demand in April Stronger Than Expected Despite Tariffs

US diesel demand, a closely watched measure of the country’s economic health, was higher in April than early weekly estimates, the Energy Information Administration said in its monthly report. Distillate fuel oil demand was 3.88 million barrels a day in April, according to the agency’s latest Petroleum Supply Monthly report released Monday. That is 4.7% higher than early estimates published by the agency in its Wednesday weekly report and 2.2% higher than April 2024. April was a volatile month for diesel futures after President Trump announced sweeping tariffs on April 2, causing prices to tank. Demand for jet fuel was revised down by 5% in the monthly EIA report to 1.76 million barrels a day from estimates of 1.86 millions barrels a day. Those same tariffs also clouded the outlook for air travel, with some Americans opting for road trips over flying as they tighten spending.  Demand for gasoline, the most consumed fuel in the US, was in-line with weekly estimates published earlier this year. Total US liquids production eked out a record-high of 20.83 million barrels a day in April, up roughly 50,000 barrels from the previous month, the report said. The number, which includes crude oil and natural gas liquids, came in roughly 340,000 barrels higher than a previous estimate for the month of April. WHAT DO YOU THINK? Generated by readers, the comments included herein do not reflect the views and opinions of Rigzone. All comments are subject to editorial review. Off-topic, inappropriate or insulting comments will be removed.

Read More »

Sapura Energy Restructuring in ‘Final Stages’

Malaysian oil and gas contractor Sapura Energy Bhd.’s restructuring plan to restore financial stability is entering its “final stages,” according to the company’s first-quarter earnings statement. Regulator Bursa Malaysia’s approval of the blueprint to restructure debt puts the company on a path to exit its financially distressed classification set by Malaysia’s stock exchange, the company said. The country’s anti-graft agency said in March it was investigating the cash-strapped company, which reported a net loss in the quarter ended in April, for alleged misappropriation of funds. Prime Minister Anwar Ibrahim said that month he ordered an audit of the firm and change of management. He also approved a 1.1 billion ringgit ($262.5 million) injection into the company, but denied that it was a bailout.  Sapura Energy’s restructuring is “aimed at addressing the group’s unsustainable debt levels and restoring financial stability,” according to its statement. “Restructuring efforts remain on track and have entered the final stages.” The company said the plan will help reduce total borrowings to 5.6 billion ringgit from 10.8 billion ringgit, without giving a time frame. Sapura Energy reported a first-quarter net loss of 478.0 million ringgit compared with a profit of 82.1 million ringgit a year ago. It cited a challenging project in Angola, as well as lower activity across the oil industry’s operations, maintenance and drilling segments, for the loss. What do you think? We’d love to hear from you, join the conversation on the Rigzone Energy Network. The Rigzone Energy Network is a new social experience created for you and all energy professionals to Speak Up about our industry, share knowledge, connect with peers and industry insiders and engage in a professional community that will empower your career in energy.

Read More »

New Jersey seeks up to 1 GW of transmission-scale storage

Dive Brief: The New Jersey Board of Public Utilities plans to procure at least 1 GW of transmission-scale energy storage in two competitive solicitations over the next 12 months, it said on June 18. The board aims to procure 350 MW to 750 MW by Oct. 31 and the remaining capacity needed to reach the 1 GW target in a second solicitation in the first half of 2026, it said. The two solicitations show New Jersey is moving forward with the clean energy plan signed into law by Gov. Phil Murphy, D, in 2018, which mandates 2 GW of new energy storage by 2030 and 100% “clean energy” by 2050. Dive Insight: The board’s long-awaited announcement came seven years after Murphy signed what was characterized at the time as an “aggressive” plan to boost the state’s renewable portfolio and storage targets. The solicitation “is the culmination of two years of extensive stakeholder engagement, incorporating valuable feedback from a diverse range of industry experts, environmental groups and public representatives,” the board said in a statement. The first phase, which opened to bidders on June 25, is open to transmission-scale projects, including standalone storage, additions to existing solar, and solar-plus-storage resources, according to the program’s website. They will be funded largely through the New Jersey Clean Energy Program budget, which receives funding from a long-running utility bill surcharge, and will not increase costs for ratepayers, the board said. “This ambitious program directly addresses demand growth and limited supply, the root causes of recent rate increases, while simultaneously building a major part of the state’s clean energy future,” the board said. New Jersey’s generation mix is 35.8% natural gas, 57.5% nuclear and 4.8% renewables, according to the U.S. Energy Information Administration. While the first phase of New Jersey’s program is focused on bulk

Read More »

Data center capacity continues to shift to hyperscalers

However, even though colocation and on-premises data centers will continue to lose share, they will still continue to grow. They just won’t be growing as fast as hyperscalers. So, it creates the illusion of shrinkage when it’s actually just slower growth. In fact, after a sustained period of essentially no growth, on-premises data center capacity is receiving a boost thanks to genAI applications and GPU infrastructure. “While most enterprise workloads are gravitating towards cloud providers or to off-premise colo facilities, a substantial subset are staying on-premise, driving a substantial increase in enterprise GPU servers,” said John Dinsdale, a chief analyst at Synergy Research Group.

Read More »

Oracle inks $30 billion cloud deal, continuing its strong push into AI infrastructure.

He pointed out that, in addition to its continued growth, OCI has a remaining performance obligation (RPO) — total future revenue expected from contracts not yet reported as revenue — of $138 billion, a 41% increase, year over year. The company is benefiting from the immense demand for cloud computing largely driven by AI models. While traditionally an enterprise resource planning (ERP) company, Oracle launched OCI in 2016 and has been strategically investing in AI and data center infrastructure that can support gigawatts of capacity. Notably, it is a partner in the $500 billion SoftBank-backed Stargate project, along with OpenAI, Arm, Microsoft, and Nvidia, that will build out data center infrastructure in the US. Along with that, the company is reportedly spending about $40 billion on Nvidia chips for a massive new data center in Abilene, Texas, that will serve as Stargate’s first location in the country. Further, the company has signaled its plans to significantly increase its investment in Abu Dhabi to grow out its cloud and AI offerings in the UAE; has partnered with IBM to advance agentic AI; has launched more than 50 genAI use cases with Cohere; and is a key provider for ByteDance, which has said it plans to invest $20 billion in global cloud infrastructure this year, notably in Johor, Malaysia. Ellison’s plan: dominate the cloud world CTO and co-founder Larry Ellison announced in a recent earnings call Oracle’s intent to become No. 1 in cloud databases, cloud applications, and the construction and operation of cloud data centers. He said Oracle is uniquely positioned because it has so much enterprise data stored in its databases. He also highlighted the company’s flexible multi-cloud strategy and said that the latest version of its database, Oracle 23ai, is specifically tailored to the needs of AI workloads. Oracle

Read More »

Datacenter industry calls for investment after EU issues water consumption warning

CISPE’s response to the European Commission’s report warns that the resulting regulatory uncertainty could hurt the region’s economy. “Imposing new, standalone water regulations could increase costs, create regulatory fragmentation, and deter investment. This risks shifting infrastructure outside the EU, undermining both sustainability and sovereignty goals,” CISPE said in its latest policy recommendation, Advancing water resilience through digital innovation and responsible stewardship. “Such regulatory uncertainty could also reduce Europe’s attractiveness for climate-neutral infrastructure investment at a time when other regions offer clear and stable frameworks for green data growth,” it added. CISPE’s recommendations are a mix of regulatory harmonization, increased investment, and technological improvement. Currently, water reuse regulation is directed towards agriculture. Updated regulation across the bloc would encourage more efficient use of water in industrial settings such as datacenters, the asosciation said. At the same time, countries struggling with limited public sector budgets are not investing enough in water infrastructure. This could only be addressed by tapping new investment by encouraging formal public-private partnerships (PPPs), it suggested: “Such a framework would enable the development of sustainable financing models that harness private sector innovation and capital, while ensuring robust public oversight and accountability.” Nevertheless, better water management would also require real-time data gathered through networks of IoT sensors coupled to AI analytics and prediction systems. To that end, cloud datacenters were less a drain on water resources than part of the answer: “A cloud-based approach would allow water utilities and industrial users to centralize data collection, automate operational processes, and leverage machine learning algorithms for improved decision-making,” argued CISPE.

Read More »

HPE-Juniper deal clears DOJ hurdle, but settlement requires divestitures

In HPE’s press release following the court’s decision, the vendor wrote that “After close, HPE will facilitate limited access to Juniper’s advanced Mist AIOps technology.” In addition, the DOJ stated that the settlement requires HPE to divest its Instant On business and mandates that the merged firm license critical Juniper software to independent competitors. Specifically, HPE must divest its global Instant On campus and branch WLAN business, including all assets, intellectual property, R&D personnel, and customer relationships, to a DOJ-approved buyer within 180 days. Instant On is aimed primarily at the SMB arena and offers a cloud-based package of wired and wireless networking gear that’s designed for so-called out-of-the-box installation and minimal IT involvement, according to HPE. HPE and Juniper focused on the positive in reacting to the settlement. “Our agreement with the DOJ paves the way to close HPE’s acquisition of Juniper Networks and preserves the intended benefits of this deal for our customers and shareholders, while creating greater competition in the global networking market,” HPE CEO Antonio Neri said in a statement. “For the first time, customers will now have a modern network architecture alternative that can best support the demands of AI workloads. The combination of HPE Aruba Networking and Juniper Networks will provide customers with a comprehensive portfolio of secure, AI-native networking solutions, and accelerate HPE’s ability to grow in the AI data center, service provider and cloud segments.” “This marks an exciting step forward in delivering on a critical customer need – a complete portfolio of modern, secure networking solutions to connect their organizations and provide essential foundations for hybrid cloud and AI,” said Juniper Networks CEO Rami Rahim. “We look forward to closing this transaction and turning our shared vision into reality for enterprise, service provider and cloud customers.”

Read More »

Data center costs surge up to 18% as enterprises face two-year capacity drought

“AI workloads, especially training and archival, can absorb 10-20ms latency variance if offset by 30-40% cost savings and assured uptime,” said Gogia. “Des Moines and Richmond offer better interconnection diversity today than some saturated Tier-1 hubs.” Contract flexibility is also crucial. Rather than traditional long-term leases, enterprises are negotiating shorter agreements with renewal options and exploring revenue-sharing arrangements tied to business performance. Maximizing what you have With expansion becoming more costly, enterprises are getting serious about efficiency through aggressive server consolidation, sophisticated virtualization and AI-driven optimization tools that squeeze more performance from existing space. The companies performing best in this constrained market are focusing on optimization rather than expansion. Some embrace hybrid strategies blending existing on-premises infrastructure with strategic cloud partnerships, reducing dependence on traditional colocation while maintaining control over critical workloads. The long wait When might relief arrive? CBRE’s analysis shows primary markets had a record 6,350 MW under construction at year-end 2024, more than double 2023 levels. However, power capacity constraints are forcing aggressive pre-leasing and extending construction timelines to 2027 and beyond. The implications for enterprises are stark: with construction timelines extending years due to power constraints, companies are essentially locked into current infrastructure for at least the next few years. Those adapting their strategies now will be better positioned when capacity eventually returns.

Read More »

Cisco backs quantum networking startup Qunnect

In partnership with Deutsche Telekom’s T-Labs, Qunnect has set up quantum networking testbeds in New York City and Berlin. “Qunnect understands that quantum networking has to work in the real world, not just in pristine lab conditions,” Vijoy Pandey, general manager and senior vice president of Outshift by Cisco, stated in a blog about the investment. “Their room-temperature approach aligns with our quantum data center vision.” Cisco recently announced it is developing a quantum entanglement chip that could ultimately become part of the gear that will populate future quantum data centers. The chip operates at room temperature, uses minimal power, and functions using existing telecom frequencies, according to Pandey.

Read More »

Microsoft will invest $80B in AI data centers in fiscal 2025

And Microsoft isn’t the only one that is ramping up its investments into AI-enabled data centers. Rival cloud service providers are all investing in either upgrading or opening new data centers to capture a larger chunk of business from developers and users of large language models (LLMs).  In a report published in October 2024, Bloomberg Intelligence estimated that demand for generative AI would push Microsoft, AWS, Google, Oracle, Meta, and Apple would between them devote $200 billion to capex in 2025, up from $110 billion in 2023. Microsoft is one of the biggest spenders, followed closely by Google and AWS, Bloomberg Intelligence said. Its estimate of Microsoft’s capital spending on AI, at $62.4 billion for calendar 2025, is lower than Smith’s claim that the company will invest $80 billion in the fiscal year to June 30, 2025. Both figures, though, are way higher than Microsoft’s 2020 capital expenditure of “just” $17.6 billion. The majority of the increased spending is tied to cloud services and the expansion of AI infrastructure needed to provide compute capacity for OpenAI workloads. Separately, last October Amazon CEO Andy Jassy said his company planned total capex spend of $75 billion in 2024 and even more in 2025, with much of it going to AWS, its cloud computing division.

Read More »

John Deere unveils more autonomous farm machines to address skill labor shortage

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More Self-driving tractors might be the path to self-driving cars. John Deere has revealed a new line of autonomous machines and tech across agriculture, construction and commercial landscaping. The Moline, Illinois-based John Deere has been in business for 187 years, yet it’s been a regular as a non-tech company showing off technology at the big tech trade show in Las Vegas and is back at CES 2025 with more autonomous tractors and other vehicles. This is not something we usually cover, but John Deere has a lot of data that is interesting in the big picture of tech. The message from the company is that there aren’t enough skilled farm laborers to do the work that its customers need. It’s been a challenge for most of the last two decades, said Jahmy Hindman, CTO at John Deere, in a briefing. Much of the tech will come this fall and after that. He noted that the average farmer in the U.S. is over 58 and works 12 to 18 hours a day to grow food for us. And he said the American Farm Bureau Federation estimates there are roughly 2.4 million farm jobs that need to be filled annually; and the agricultural work force continues to shrink. (This is my hint to the anti-immigration crowd). John Deere’s autonomous 9RX Tractor. Farmers can oversee it using an app. While each of these industries experiences their own set of challenges, a commonality across all is skilled labor availability. In construction, about 80% percent of contractors struggle to find skilled labor. And in commercial landscaping, 86% of landscaping business owners can’t find labor to fill open positions, he said. “They have to figure out how to do

Read More »

2025 playbook for enterprise AI success, from agents to evals

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More 2025 is poised to be a pivotal year for enterprise AI. The past year has seen rapid innovation, and this year will see the same. This has made it more critical than ever to revisit your AI strategy to stay competitive and create value for your customers. From scaling AI agents to optimizing costs, here are the five critical areas enterprises should prioritize for their AI strategy this year. 1. Agents: the next generation of automation AI agents are no longer theoretical. In 2025, they’re indispensable tools for enterprises looking to streamline operations and enhance customer interactions. Unlike traditional software, agents powered by large language models (LLMs) can make nuanced decisions, navigate complex multi-step tasks, and integrate seamlessly with tools and APIs. At the start of 2024, agents were not ready for prime time, making frustrating mistakes like hallucinating URLs. They started getting better as frontier large language models themselves improved. “Let me put it this way,” said Sam Witteveen, cofounder of Red Dragon, a company that develops agents for companies, and that recently reviewed the 48 agents it built last year. “Interestingly, the ones that we built at the start of the year, a lot of those worked way better at the end of the year just because the models got better.” Witteveen shared this in the video podcast we filmed to discuss these five big trends in detail. Models are getting better and hallucinating less, and they’re also being trained to do agentic tasks. Another feature that the model providers are researching is a way to use the LLM as a judge, and as models get cheaper (something we’ll cover below), companies can use three or more models to

Read More »

OpenAI’s red teaming innovations define new essentials for security leaders in the AI era

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More OpenAI has taken a more aggressive approach to red teaming than its AI competitors, demonstrating its security teams’ advanced capabilities in two areas: multi-step reinforcement and external red teaming. OpenAI recently released two papers that set a new competitive standard for improving the quality, reliability and safety of AI models in these two techniques and more. The first paper, “OpenAI’s Approach to External Red Teaming for AI Models and Systems,” reports that specialized teams outside the company have proven effective in uncovering vulnerabilities that might otherwise have made it into a released model because in-house testing techniques may have missed them. In the second paper, “Diverse and Effective Red Teaming with Auto-Generated Rewards and Multi-Step Reinforcement Learning,” OpenAI introduces an automated framework that relies on iterative reinforcement learning to generate a broad spectrum of novel, wide-ranging attacks. Going all-in on red teaming pays practical, competitive dividends It’s encouraging to see competitive intensity in red teaming growing among AI companies. When Anthropic released its AI red team guidelines in June of last year, it joined AI providers including Google, Microsoft, Nvidia, OpenAI, and even the U.S.’s National Institute of Standards and Technology (NIST), which all had released red teaming frameworks. Investing heavily in red teaming yields tangible benefits for security leaders in any organization. OpenAI’s paper on external red teaming provides a detailed analysis of how the company strives to create specialized external teams that include cybersecurity and subject matter experts. The goal is to see if knowledgeable external teams can defeat models’ security perimeters and find gaps in their security, biases and controls that prompt-based testing couldn’t find. What makes OpenAI’s recent papers noteworthy is how well they define using human-in-the-middle

Read More »