如何在Power Query中筛选下月值为100的'inactive'人员数据
Power Query 动态筛选实现方案
针对你需要筛选Category='inactive'且下月对应列值=100的需求,因为月份列是动态新增的,不能硬编码列名,以下是完整的M语言实现逻辑:
步骤1:分离固定列与动态月份列
先把ID、Name、Category这些固定列和动态月份列拆分,方便后续处理:
let 源 = 你的数据源, // 替换成实际的数据源步骤名 // 定义固定列列表 fixedColumns = {"ID", "Name", "Category"}, // 提取所有月份列名(排除固定列) monthColumns = List.RemoveItems(Table.ColumnNames(源), fixedColumns)
步骤2:处理月份列的顺序与下月映射
把月份列名转换成可计算的日期,确保排序正确,并找到当前最后一个月份的下一个月列名:
// 将月份缩写转成日期(用任意年份做基准,只需要月份顺序) monthDates = List.Transform(monthColumns, each Date.FromText("1 " & _ & " 2024")), // 按日期排序月份列,保证时间顺序正确 sortedMonthColumns = List.Sort(monthColumns, (a,b) => Date.FromText("1 " & a & " 2024") > Date.FromText("1 " & b & " 2024")), // 获取最后一个月份列 lastMonth = List.Last(sortedMonthColumns), // 计算最后一个月份的下一个月,并转成缩写格式 nextMonth = Date.Format(Date.AddMonths(Date.FromText("1 " & lastMonth & " 2024"), 1), "MMM"), // 检查下月列是否已存在于数据中 hasNextMonth = List.Contains(monthColumns, nextMonth)
步骤3:添加下月列值的自定义列
如果下月列存在,就提取对应的值;不存在则标记为null:
// 添加自定义列获取下月列的值 addNextMonthValue = if hasNextMonth then Table.AddColumn(源, "下月值", each Record.Field(_, nextMonth)) else Table.AddColumn(源, "下月值", each null)
步骤4:筛选符合条件的行
最后筛选出Category为inactive且下月值等于100的行,可选移除临时列:
// 筛选目标行 filteredRows = Table.SelectRows(addNextMonthValue, each [Category] = "inactive" and [下月值] = 100), // 移除临时的"下月值"列(可选) finalTable = Table.RemoveColumns(filteredRows, {"下月值"}) in finalTable
核心优势
- 完全动态适配月份列新增:不管后续加Mar、Apr还是其他月份缩写列,代码都会自动识别最后一个月份并找到下月列。
- 无需硬编码列名:避免后续新增月份后需要修改代码的麻烦。
- 兼容下月列未新增的情况:如果下月列还没添加,会自动标记为null,不会筛选出错误数据。
内容的提问来源于stack exchange,提问作者Swethaa
相关产品推荐
相关产品推荐

