Power BI中按星期几计算移动平均值及州筛选失效问题
Power BI 实现带州切片器的日期差值计算
问题背景
现有能源公司测量数据表,结构如下:
| Date | State | Measurement |
|---|---|---|
| 22/05/2024 | DF | 10 |
| 22/05/2024 | DF | 72 |
| 22/05/2024 | MG | 2 |
| 22/05/2024 | RJ | 22 |
| 15/05/2024 | DF | 99 |
| 15/05/2024 | MG | 33 |
| 15/05/2024 | MG | 88 |
| 08/05/2024 | DF | 33 |
| 08/05/2024 | RJ | 12 |
| 08/05/2024 | RJ | 77 |
| 01/05/2024 | DF | 88 |
| 01/05/2024 | DF | 1 |
| 01/05/2024 | DF | 32 |
| 24/04/2024 | MG | 22 |
| 24/04/2024 | RJ | 55 |
| 24/04/2024 | DF | 10 |
需搭建带州切片器的报表,计算当日平均测量值与过去4周内同星期几平均测量值的差值,要求:
- 未选州时:计算所有州的对应均值差值
- 选单个/多个州时:仅计算选中州的对应均值差值
此前尝试的方法无法正确将州切片器的筛选应用到过去4周均值的计算中。
解决方案
步骤1:创建日期表
Power BI中需使用独立日期表来处理星期几和日期范围逻辑,执行以下DAX创建:
DateTable = ADDCOLUMNS( CALENDAR(MIN('Measurements'[Date]), MAX('Measurements'[Date])), "Weekday", WEEKDAY([Date], 2), // 1=周一,7=周日,可按需调整 "WeekNum", WEEKNUM([Date], 2) )
创建后将DateTable[Date]与事实表Measurements[Date]建立一对多关系。
步骤2:编写核心DAX度量
1. 当日平均测量值
当日均值 = AVERAGE('Measurements'[Measurement])
2. 过去4周同星期几平均测量值
核心是通过KEEPFILTERS保留州切片器的筛选,同时精准筛选日期范围:
过去4周同星期均值 = VAR 当前日期 = MAX('DateTable'[Date]) VAR 当前星期几 = MAX('DateTable'[Weekday]) VAR 目标日期范围 = FILTER( ALLSELECTED('DateTable'), 'DateTable'[Date] >= 当前日期 - 28 && // 过去4周内 'DateTable'[Date] < 当前日期 && // 排除当日 'DateTable'[Weekday] = 当前星期几 // 匹配星期几 ) RETURN CALCULATE( AVERAGE('Measurements'[Measurement]), 目标日期范围, KEEPFILTERS('Measurements'[State]) // 保留州切片器的筛选条件 )
3. 差值计算
Variation = [当日均值] - [过去4周同星期均值]
步骤3:搭建报表
- 添加州切片器:选择
Measurements[State]字段 - 添加表格:选择
DateTable[Date]和Variation度量 - 调整表格格式,匹配需求输出
逻辑说明
KEEPFILTERS确保计算过去4周均值时,不会忽略州切片器的筛选,完美适配「无选择/单个/多个州」三种场景ALLSELECTED('DateTable')避免日期筛选器(若有)限制过去4周的日期范围,同时保留用户可能设置的全局日期筛选- 日期表的
Weekday函数用参数2确保周一为星期起始,可根据业务需求调整为1(周日起始)
内容的提问来源于stack exchange,提问作者Mateus Mattos
相关产品推荐
相关产品推荐

