将PowerBI查询改为追加数据并去重而非覆盖全表的技术问询
解决PowerBI从Sentinel拉取数据时保留超90天历史数据的方案
因为Sentinel API只能返回90天的滚动数据,而你需要保留更久的历史记录,核心思路就是把现有历史数据和新拉的90天数据合并,再去重——既留住旧数据,又更新已有事件的最新状态。
具体操作步骤
1. 先存好现有历史数据
别让刷新把旧数据清了,先把当前PowerBI里的完整数据存成一个本地查询:
- 在「数据」面板右键点你现在的表 → 「复制」
- 右键「查询」面板 → 「粘贴」,把新查询改名叫
历史数据 - 编辑这个
历史数据查询,删掉原来的API拉取代码,只留最终的表结构(这样它就存的是本地缓存的历史记录,不会随刷新清空)
2. 保留原API查询拉新数据
原来的API查询逻辑不变,把它改名叫新拉取数据,专门用来每次刷新获取最新90天的快照。
3. 合并两个表并去重
新建一个查询,命名为合并后数据,代码如下:
let // 加载本地保存的历史数据 历史数据 = 历史数据, // 加载新拉的90天数据 新拉取数据 = 新拉取数据, // 合并两个表 合并表 = Table.Combine({历史数据, 新拉取数据}), // 按Incident字段去重(Incident是事件唯一标识) 去重表 = Table.Distinct(合并表, {"Incident"}), // 可选:按创建时间倒序排序,方便查看最新数据 排序表 = Table.Sort(去重表, {{"CreatedTime", Order.Descending}}) in 排序表
4. 绑定仪表板到新表
把原来仪表板里所有依赖旧表的视觉对象,都改成用这个合并后数据表即可。
额外优化:处理事件状态更新
如果有些事件的状态(比如Status、ClosedTime)会更新,去重时最好保留最新的那条记录,用下面的代码替换上述步骤中的去重部分:
// 按Incident分组,每组取CreatedTime最新的记录 去重表 = Table.Group(合并表, {"Incident"}, { {"最新记录", each Table.Sort(_, {{"CreatedTime", Order.Descending}}){0}, type record} }), // 把分组后的记录展开成列 展开表 = Table.ExpandRecordColumn(去重表, "最新记录", Table.ColumnNames(合并表))
注意点
- 确认
Incident是每个事件的唯一标识,如果不是,就换成多个字段组合(比如Incident+CreatedTime)作为去重依据 - 每次刷新时,
新拉取数据会自动获取最新90天数据,和历史数据合并后就是完整的全量数据
内容的提问来源于stack exchange,提问作者Mark Tait
相关产品推荐
相关产品推荐

