Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Python | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Python | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA | Python |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA | Python
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Databricks | Power Apps | Power Automate |
Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables | Power Apps | Power Automate
Power BI | Power Apps | Power Automate | SQL | VBA | Python | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables
Power BI | Power Apps | Power Automate | SQL | VBA | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Most teams hit the same wall: incremental refresh works fine until the data engineer backfills a year of history or a batch of late transactions lands in the lakehouse, and suddenly your Power BI dataset either misses those rows or spends hours reprocessing everything.
This walkthrough shows how to design advanced incremental refresh patterns in Power BI with Fabric Lakehouses to handle late‑arriving facts, controlled backfills, and targeted historical reprocessing without losing performance or correctness.
You’re supporting a retail analytics workspace:
factOrders partitioned by OrderDate.Pain points:
OrderDate (system delays, external integrations).You want:
Everything below assumes:
Before tweaking patterns, you need the mental model.
Incremental refresh for import models (including in Fabric) works roughly like this when you first publish and refresh:
RangeStart and RangeEnd (type DateTime).Key constraints (as of late 2026):
Date/DateTime in the fact table.RangeStart and RangeEnd in Power Query.With Fabric Lakehouses, the same rules apply; the difference is in how you source the data and how fast the lakehouse can serve partition reads.
Our retail scenario uses OrderDate as the partitioning column.
Problem: late‑arriving rows with an OrderDate inside a past partition won’t be picked up if that partition is never refreshed.
The simplest pattern is to intentionally overlap the incremental window with recent history.
Example policy for factOrders:
This means:
Implementation in Power Query (simplified):
let
Source = Sql.Database("MyWorkspace-SqlEndpoint", "RetailLakehouse"),
Orders = Source{[Schema = "dbo", Name = "factOrders"]}[Data],
// Ensure OrderDate is DateTime
Typed = Table.TransformColumnTypes(Orders, {{"OrderDate", type datetime}}),
// Incremental filter
Filtered = Table.SelectRows(
Typed,
each [OrderDate] >= RangeStart and [OrderDate] < RangeEnd
)
in
Filtered
In the service, you set the incremental refresh policy on OrderDate with a 5‑year storage window and a 30‑day incremental window.
Why this works:
OrderDate in the last 30 days lands in a partition that is refreshed on each run.Trade‑offs:
Sometimes late arrivals are more than 30 days old. For example, a partner sends a batch of corrections for orders from two months ago.
If you partition on OrderDate (business date), those rows land in older partitions that may not be refreshed.
An alternative is to partition on a system ingestion date column, e.g. LoadTimestamp.
Pros:
Cons:
OrderDate are independent of partitioning; that’s fine, but you must ensure LoadTimestamp exists and is reliable.Power Query filter using LoadTimestamp:
let
Source = Sql.Database("MyWorkspace-SqlEndpoint", "RetailLakehouse"),
Orders = Source{[Schema = "dbo", Name = "factOrders"]}[Data],
Typed = Table.TransformColumnTypes(Orders, {{"LoadTimestamp", type datetime}}),
Filtered = Table.SelectRows(
Typed,
each [LoadTimestamp] >= RangeStart and [LoadTimestamp] < RangeEnd
)
in
Filtered
You still expose OrderDate for reporting; the incremental refresh cares only about LoadTimestamp.
In practice, many teams:
LoadTimestamp for incremental refresh.OrderDate purely as a business attribute.This is robust for late‑arriving facts, but you need good data engineering discipline to populate LoadTimestamp consistently in the lakehouse.
Backfills are different from late arrivals. A backfill can rewrite an entire year of data, including rows that already existed.
With incremental refresh, you have three main options.
If backfills are limited to recent history (e.g. “we occasionally reprocess the last 90 days”), you can extend the incremental window to cover that period.
Example policy:
Behavior:
This works as long as:
If backfills can affect older periods (e.g. a tax logic change for last year), you generally don’t want to permanently increase the incremental window.
Instead, you:
For import models, a full refresh:
This is the safe pattern for infrequent, large backfills.
To limit impact:
For teams comfortable with XMLA and scripting, you can refresh only the partitions affected by the backfill.
High‑level steps:
OrderDate from 2025‑04‑01 to 2025‑06‑30).Refresh command for only those partitions.This pattern:
It requires:
Sometimes the lakehouse data hasn’t changed, but you change your transformation logic in Power Query (e.g. new currency conversion, updated status mapping) and need it applied to history.
Incremental refresh won’t automatically reprocess historical partitions when you change the query.
For our retail factOrders model:
Behavior:
After that refresh completes:
Caveats:
For larger historical reprocessing (multi‑year), a full refresh is usually simpler operationally.
Fabric Lakehouses bring a few nuances to incremental refresh.
The lakehouse table itself may be partitioned by a column (e.g. OrderDate or LoadTimestamp). Incremental refresh partitions in Power BI are independent of lakehouse partitions, but you can align them for performance.
Practical tips:
OrderDate, choose an incremental window that maps cleanly to months.Lakehouse schema changes (adding/removing columns, changing types) can break refresh.
When you plan backfills or historical reprocessing:
This article assumes import mode with incremental refresh.
If you use Direct Lake:
For mixed scenarios (Direct Lake for some tables, import for others), treat each table according to its storage mode and avoid assuming incremental refresh controls Direct Lake behavior.
Let’s apply a concrete pattern to our scenario.
LoadTimestamp to factOrders in the lakehouse (if not already present).LoadTimestamp for the incremental filter in Power Query.Result:
Before you tune anything else, sit down with your data engineering team and map out how far back data can change (late arrivals, backfills, and logic updates), then set your incremental window and partitioning column to match that reality; most of the pain around advanced incremental refresh patterns disappears once your policy reflects how your Fabric lakehouse actually behaves.
This article reflects the shift toward using Fabric Lakehouse-aware incremental refresh policies to handle late-arriving facts, controlled backfills, and targeted historical reprocessing in Power BI datasets, especially in teams with frequent upstream data corrections.
Professionals who want to apply these patterns to their own data can explore Excelgoodies' Power BI Training programme - taught live by instructors, with certification awarded once a real project is running at work.
Insights compiled through ongoing industry research and discussions within the Excelgoodies Analytics Community.
Power BI
New
Next Batches Now Live
Power BI
SQL
Power Apps
Power Automate
Microsoft Fabrics
Azure Data Engineering