Power Query多条件筛选:获取RAM与SoCal各自最新文件
解决Power Query筛选RAM和SoCal各自最新文件的问题
你的原代码问题在于:它取的是整个表格的最大日期,然后只保留这个日期下包含RAM/SoCal的文件,但RAM和SoCal的最新日期可能不同(比如你例子里RAM的最新日期早于SoCal),所以只会返回最大日期对应的那一个文件,不符合需求。
正确的思路是按"RAM"和"SoCal"分组,分别找出每组的最新日期,再筛选每组内对应最新日期的文件。以下是具体实现步骤和代码:
步骤1:添加分组标识列
先给每行标记所属的分组(RAM或SoCal),方便后续分组计算:
= Table.AddColumn(GetDateFromFileName, "Group", each if Text.Contains([Name], "RAM") then "RAM" else if Text.Contains([Name], "SoCal") then "SoCal" else null)
可额外过滤掉不属于这两个分组的行,避免干扰:
= Table.SelectRows(上一步结果, each [Group] <> null)
步骤2:按分组计算每组的最新日期
用分组功能,对每个Group计算对应的最大日期:
= Table.Group(上一步结果, {"Group"}, {{"LatestDate", each List.Max([Text Between Delimiters]), type date}})
注意:如果Text Between Delimiters是文本格式,需先转为日期类型,比如List.Max(Date.From([Text Between Delimiters])),否则无法正确比较日期大小。
步骤3:合并回原表并筛选
将分组得到的最新日期表和原表(带Group列的)合并,然后筛选出原表日期等于对应组LatestDate的行:
= let // 添加分组列并过滤无关行 AddGroup = Table.AddColumn(GetDateFromFileName, "Group", each if Text.Contains([Name], "RAM") then "RAM" else if Text.Contains([Name], "SoCal") then "SoCal" else null), FilterGroups = Table.SelectRows(AddGroup, each [Group] <> null), // 计算每组最新日期 Grouped = Table.Group(FilterGroups, {"Group"}, {{"LatestDate", each List.Max(Date.From([Text Between Delimiters])), type date}}), // 合并表并筛选 Merged = Table.NestedJoin(FilterGroups, {"Group"}, Grouped, {"Group"}, "GroupData", JoinKind.LeftOuter), ExpandLatest = Table.ExpandTableColumn(Merged, "GroupData", {"LatestDate"}, {"LatestDate"}), FilterLatest = Table.SelectRows(ExpandLatest, each Date.From([Text Between Delimiters]) = [LatestDate]), // 清理辅助列(可选) CleanColumns = Table.RemoveColumns(FilterLatest, {"Group", "LatestDate"}) in CleanColumns
简化版代码(一步式)
如果不想分步写,也可以用嵌套逻辑实现:
= Table.SelectRows( GetDateFromFileName, let // 筛选目标文件并分组取最新日期 TargetFiles = Table.SelectRows(GetDateFromFileName, each Text.Contains([Name], "RAM") or Text.Contains([Name], "SoCal")), GroupMax = Table.Group(TargetFiles, {"Group"}, {{"MaxDate", each List.Max(Date.From([Text Between Delimiters]))}}), // 构建分组-最大日期的映射 DateMap = Record.FromList(GroupMax[MaxDate], GroupMax[Group]) in each let currentGroup = if Text.Contains([Name], "RAM") then "RAM" else "SoCal" in Date.From([Text Between Delimiters]) = DateMap[currentGroup] )
关键说明
- 核心是按分组单独计算最新日期,而非取全局最大日期
- 必须确保日期列是可比较的日期类型,文本格式的日期需要用
Date.From()转换后再进行比较
内容的提问来源于stack exchange,提问作者user1527227
相关产品推荐
相关产品推荐

