Power BI:在Query Editor中创建含自定义列的客户年度表
嘿,我来帮你搞定Power BI Query Editor里的这个自定义列需求!看你给出的示例,应该是要给每个客户的最新年份记录标记TRUE,其他年份标记FALSE对吧?刚好可以在Query Editor里纯用M语言实现,不用依赖度量值,具体步骤如下:
实现步骤(Power BI Query Editor内操作)
1. 准备基础表
先确保你已经有了包含Clientnumber、Year、Amount的基础表——不管是从数据源加载的,还是用「输入数据」功能手动创建的示例表都可以。
2. 分组计算每个客户的最新年份
我们需要先给每个客户算出他们的最大年份,用分组功能就能搞定:
- 选中你的表,切换到「转换」选项卡 → 点击「分组依据」
- 分组依据选择
Clientnumber,新列名填MaxYear,操作选「最大值」,关联列选Year - 点击确定后,你会得到一张只有客户编号和对应最大年份的分组表。
3. 合并原表与分组表
回到原表,把刚才的分组表合并进来,这样每一行都能拿到对应客户的最大年份:
- 切换到「主页」选项卡 → 点击「合并查询」→ 选择「合并查询作为新查询」(或者直接合并到原表也可以)
- 原表和分组表都选择
Clientnumber作为匹配列,合并类型选「左外部」(确保原表所有行都保留) - 确定后会新增一列带分组表记录的列,点击该列的展开按钮,只勾选
MaxYear列展开即可。
4. 添加自定义列判断是否为最新年份
现在来加那个标记列:
- 切换到「添加列」选项卡 → 点击「自定义列」
- 在弹出的公式框里输入这段M语言:
[Year] = [MaxYear]
- 点击确定,这列就会自动返回
TRUE(当该行是客户的最新年份)或FALSE(其他年份),完全匹配你的示例输出!
(可选)清理冗余列
如果不需要保留MaxYear列,右键该列选择「删除」就好。
直接用高级编辑器的完整代码
如果你想跳过手动操作,直接在高级编辑器里替换代码(假设你的原表叫Source):
let Source = // 这里替换成你的数据源,比如Excel.Csv("C:\你的文件路径.csv")或者Enter Data的结果 #"Changed Type" = Table.TransformColumnTypes(Source,{{"Clientnumber", Int64.Type}, {"Year", Int64.Type}, {"Amount", Int64.Type}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"Clientnumber"}, {{"MaxYear", each List.Max([Year]), Int64.Type}}), #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Clientnumber"}, #"Grouped Rows", {"Clientnumber"}, #"Grouped Rows", JoinKind.LeftOuter), #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", #"Grouped Rows", {"MaxYear"}, {"MaxYear"}), #"Added Custom" = Table.AddColumn(#"Expanded Grouped Rows", "Custom", each [Year] = [MaxYear]), #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"MaxYear"}) in #"Removed Columns"
补充说明
如果你的实际需求是判断「最近3年的金额是否为空」(比如当前行年份在近3年且金额为空),可以调整自定义列的公式,比如假设当前年份是2024,公式可以改成:
[Year] >= Date.Year(DateTime.LocalNow()) - 2 and [Amount] = null
但从你的示例输出来看,标记最新年份的方案更符合你的需求~
内容的提问来源于stack exchange,提问作者rick van der horst
相关产品推荐
相关产品推荐

