PowerBI折线图中同时展示小时价格与每日均价的实现方法
解决PowerBI中小时级折线图同时展示每日均价的问题
问题描述
我有一张展示指数每小时价格的折线图,想在同图中添加每日价格平均值。已经计算了对应的度量值,但添加到小时级图表后,平均值变成了小时级(每个小时都计算一次,而非整日均一值)。示例数据如下:
| 日期 | 小时 | 价格 | 每日均价 |
|---|---|---|---|
| 2023/1/1 | 1 | 100 | 150 |
| 2023/1/1 | 2 | 150 | 150 |
| 2023/1/1 | 3 | 200 | 150 |
| 2023/1/2 | 1 | 50 | 60 |
| 2023/1/2 | 2 | 60 | 60 |
| 2023/1/2 | 3 | 70 | 60 |
需要实现的效果是:折线图中同时显示小时级的「price」折线,以及每日固定值的「daily_average」折线(每个日期下所有小时的均价一致)。
解决方案
问题核心是度量值的上下文过滤:当把度量值放到小时级图表中时,小时维度会自动过滤计算上下文,导致平均值按小时重新计算。需要修改度量值,强制忽略小时维度,仅基于日期维度计算每日均价。
方法1:使用ALL函数清除小时上下文
创建(或修改)每日均价的度量值,用ALL函数移除小时列的筛选影响:
每日均价 = CALCULATE( AVERAGE('表名'[价格]), ALL('表名'[小时]) )
- 原理:
ALL('表名'[小时])会清除当前上下文对「小时」列的筛选,让计算基于整个日期的所有小时数据求平均,因此每个日期下的所有小时都会返回同一个均价。
方法2:使用ALLEXCEPT保留日期上下文
如果数据模型中有单独的日期表,或者想更精准地保留日期筛选,可使用ALLEXCEPT:
每日均价 = CALCULATE( AVERAGE('表名'[价格]), ALLEXCEPT('表名', '表名'[日期]) )
- 原理:
ALLEXCEPT('表名', '表名'[日期])会清除除了「日期」之外的所有筛选上下文,确保计算仅受日期维度影响,忽略小时等其他维度的筛选。
方法3:使用SUMMARIZE预聚合每日均价
如果需要更直观的预计算,也可以先创建一个每日均价的汇总表,再关联到原表:
- 创建计算表:
每日均价表 = SUMMARIZE( '表名', '表名'[日期], "每日均价", AVERAGE('表名'[价格]) )
- 将原表的「日期」列与新表的「日期」列建立关系
- 在折线图中直接使用新表的「每日均价」字段
验证效果
修改度量值后,将「price」和「每日均价」同时添加到折线图的「值」区域,X轴保持为「日期+小时」(或小时级时间轴),即可看到:
- 「price」折线展示每个小时的价格波动
- 「每日均价」折线为每日一条水平直线,同一日期下所有小时的均价一致
内容的提问来源于stack exchange,提问作者Stefano Alfano
相关产品推荐
相关产品推荐

