Power Query多表条件筛选计算统计值问题求助
Power Query 实现按区间筛选历史数据并计算统计值
操作步骤
1. 生成筛选后的Price列表列
打开Forecast_Tbl,点击添加列 > 自定义列,输入以下M代码并将列命名为Filtered_Prices:
= Table.SelectRows(Historical_Data_Table, each [Cloud%] >= [Min_Cloud] and [Cloud%] <= [Max_Cloud] and [Wind_KM] >= [Min_Wind] and [Wind_KM] <= [Max_Wind] and [Solar_Utiliz] >= [Min_Solar] and [Solar_Utiliz] <= [Max_Solar] )[Price]
这一步会为每行生成符合当前区间条件的所有Price值组成的列表。
2. 逐个添加统计列
基于Filtered_Prices列,依次添加以下6个统计列:
COUNT列
自定义列公式:
= List.Count([Filtered_Prices])
命名为COUNT。
MIN列
自定义列公式(空列表时返回null避免报错):
= if List.Count([Filtered_Prices]) > 0 then List.Min([Filtered_Prices]) else null
命名为MIN。
MAX列
自定义列公式:
= if List.Count([Filtered_Prices]) > 0 then List.Max([Filtered_Prices]) else null
命名为MAX。
AVERAGE列
自定义列公式:
= if List.Count([Filtered_Prices]) > 0 then List.Average([Filtered_Prices]) else null
命名为AVERAGE。
MEDIAN列
自定义列公式:
= if List.Count([Filtered_Prices]) > 0 then List.Median([Filtered_Prices]) else null
命名为MEDIAN。
MODE列
Power Query无内置List.Mode函数,需先自定义函数:
- 点击主页 > 高级编辑器,在代码开头插入以下函数:
List.Mode = (lst as list) as any => let CountItems = Table.Group(Table.FromList(lst, Splitter.SplitByNothing()), {"Column1"}, {{"Count", each Table.RowCount(_), Int64.Type}}), Sorted = Table.Sort(CountItems, {{"Count", Order.Descending}}), MaxCount = Sorted{0}[Count], ModeItems = Table.SelectRows(Sorted, each [Count] = MaxCount)[Column1], Result = if List.Count(ModeItems) = 1 then ModeItems{0} else ModeItems in Result;
- 返回
Forecast_Tbl,添加MODE列的自定义公式:
= if List.Count([Filtered_Prices]) > 0 then List.Mode([Filtered_Prices]) else null
命名为MODE。
3. 可选:清理中间列
如果不需要Filtered_Prices列,右键删除即可。
注意点
- 确保两个表的列名完全匹配,比如历史表的云量列是
Cloud%,预测表的区间列是Min_Cloud/Max_Cloud,列名不一致时要修改M代码中的引用。 - 若历史数据量极大,逐行筛选效率可能偏低,可后续再优化分组逻辑,新手优先用上述直观方法。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

