You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:29:59