Power BI如何基于选定日期区间筛选数据表中的新增记录
DAX实现无关系日期筛选下的区间新增ID展示
问题描述
现有存储ID月度快照的事实表,样例数据如下:
Id date A 2022-01-31 B 2022-01-31 C 2022-01-31 D 2022-02-28 A 2022-02-28 B 2022-02-28 C 2022-02-28 E 2022-03-31 D 2022-03-31 A 2022-03-31 B 2022-03-31 C 2022-03-31
报表配置说明:
- 页面放置两个独立日期筛选器
D_start(起始日期)、D_end(结束日期),取值来自独立DimDate表,该表未与事实表建立模型关系,仅提供可选日期值 - 需求:根据筛选器选中的日期区间,仅展示区间内的新增ID记录(即ID首次出现的日期落在区间内,且仅展示首次出现的那条记录),预期效果如下:
- 选
D_start=2022-01-31、D_end=2022-02-28时,仅展示D 2022-02-28 - 选
D_start=2022-01-31、D_end=2022-03-31时,展示D 2022-02-28、E 2022-03-31 - 选
D_start=2022-02-28、D_end=2022-03-31时,仅展示E 2022-03-31
- 选
- 已知可通过ETL预加工新增ID数据集实现,需要纯DAX实现方案。
实现方案
不需要调整模型关系、不需要预加工数据,通过度量值+视觉级筛选即可实现,步骤如下:
- 先写度量值获取筛选器选中的起止日期,因
DimDate和事实表无关系,直接取选中范围的最大最小值即可:Selected Start = MIN('DimDate'[Date]) Selected End = MAX('DimDate'[Date]) - 写度量值计算每个ID的首次出现(新增)日期:
ID First Date = CALCULATE( MIN('FactTable'[date]), ALLEXCEPT('FactTable', 'FactTable'[Id]) ) - 写行级判断的标记度量值,用来过滤不符合要求的记录:
Is Valid New Record = VAR _first_date = [ID First Date] VAR _s = [Selected Start] VAR _e = [Selected End] RETURN INT( _first_date >= _s && _first_date <= _e && SELECTEDVALUE('FactTable'[date]) = _first_date ) - 把
Id、date字段拖到表格视觉对象,再把Is Valid New Record度量值加到该表格的视觉级筛选器,设置筛选条件为值等于 1即可。
逻辑说明:判断条件分三层,一是ID的新增日期在选中区间内,二是当前行的日期刚好是该ID的新增日期,这样就会自动过滤掉老ID在后续月份的快照记录,只保留区间内新增ID的首条记录,完全匹配需求中的三个场景。
内容的提问来源于stack exchange,提问作者SQALEX101
相关产品推荐
相关产品推荐

