Power BI Desktop如何实现SQL Server事实表的增量数据导入?
Power BI Desktop 事实表增量导入解决方案
一、官方增量刷新(推荐方案)
这是Power BI自带的增量刷新功能,能自动保留历史数据并仅导入新增数据,无需手动维护历史文件,稳定性更高。
开启增量刷新
打开Power Query编辑器,选中目标事实表,点击顶部「主页」选项卡的「增量刷新」按钮,弹出配置窗口。配置刷新规则
- 勾选「启用增量刷新」
- 设置「存档数据起始日期」:比如设为1年前,确保模型保留足够的历史数据
- 设置「增量刷新范围」:建议设为7天(避免因数据延迟导致漏导)
- 可选:勾选「仅刷新完整时间段」,确保只导入已结束的日期数据
修改M代码适配参数
系统会自动生成RangeStart和RangeEnd两个参数,替换你原代码中的StartDate,修改筛选条件如下:
let Source = Sql.Database("10.Xx.Xx.Xx", "MY_DB"), dbo_fact_table = Source{[Schema="dbo",Item="fact_table"]}[Data], filteredRows = Table.SelectRows(dbo_fact_table, each [date] >= RangeStart and [date] < RangeEnd) in filteredRows
- 完成刷新
关闭Power Query编辑器,回到主界面点击「刷新」,此时Power BI只会读取RangeStart到RangeEnd区间的新增数据,并追加到现有模型中,不会清除原有1000万行数据。
二、手动M代码实现追加(特殊场景适用)
如果不想用官方增量刷新,可以通过追加查询+去重逻辑实现,需依赖唯一键(如主键ID)避免重复导入。
导出历史数据到本地
先将模型中现有1000万行数据导出为CSV/Parquet文件,作为历史数据存储(仅第一次操作需要)。创建新数据查询
修改原有查询,动态获取上次刷新日期作为筛选起点(比如取当前日期前一天),确保只拉取新增数据:
let Source = Sql.Database("10.Xx.Xx.Xx", "MY_DB"), dbo_fact_table = Source{[Schema="dbo",Item="fact_table"]}[Data], LastRefreshDate = DateTime.LocalNow() - #duration(1,0,0,0), // 动态计算昨天的日期 filteredRows = Table.SelectRows(dbo_fact_table, each [date] >= LastRefreshDate) in filteredRows
- 合并历史数据与新数据
在Power Query编辑器中新建查询,将本地历史数据和上述新数据查询进行合并,同时添加去重逻辑:
let // 加载本地历史数据 HistoricalData = Csv.Document(File.Contents("C:\你的历史数据文件路径.csv"), [Delimiter=",", Encoding=1252, QuoteStyle=QuoteStyle.Csv]), // 加载新数据(调用上面创建的新数据查询) NewData = 新数据查询名称, // 追加数据 CombinedData = Table.Combine({HistoricalData, NewData}), // 根据唯一键去重(假设id是主键) RemovedDuplicates = Table.Distinct(CombinedData, {"id"}) in RemovedDuplicates
为什么原有方法会清除数据?
你之前的M代码直接返回筛选后的新数据,Power BI默认会用查询结果替换模型中的全部数据,而非追加。只有通过增量刷新或手动追加逻辑,才能实现保留历史数据+新增数据的效果。
内容的提问来源于stack exchange,提问作者Boris EKUE-HETTAH
相关产品推荐
相关产品推荐

