如何在Power Query中仅排序非空Date单元格并保留空白位置?
在Power Query中实现仅对Date列非空单元格升序排序并保留空白位置的方法
步骤1:导入数据并添加原始索引列
- 将Excel表格导入Power Query编辑器(数据选项卡→从表格/范围)。
- 添加自定义索引列:点击「添加列」→「索引列」→「从0开始」(或从1开始,只要能标记原始行位置即可),命名为
OriginalIndex。
步骤2:拆分表格为空白行与非空白行
- 添加自定义列
IsDateEmpty,公式根据Date列的类型选择:- 如果Date是日期类型:
= [Date] = null - 如果Date是文本类型:
= [Date] = null or [Date] = ""
- 如果Date是日期类型:
- 筛选
IsDateEmpty为true,将这些行另存为查询BlankRows;筛选IsDateEmpty为false,另存为查询NonBlankRows。
步骤3:对非空白行按Date列升序排序
- 在
NonBlankRows查询中,选中Date列,点击工具栏的「升序排序」按钮,完成非空Date的排序。
步骤4:重新合并表格并恢复原始空白行位置
- 创建新的空白查询,使用以下M语言代码合并两个查询,按原始索引恢复结构:
let // 获取所有原始索引值并排序 AllIndexes = List.Sort(List.Distinct(BlankRows[OriginalIndex] & NonBlankRows[OriginalIndex])), // 创建基于原始索引的空表 ReconstructedTable = Table.FromList(AllIndexes, Splitter.SplitByNothing(), {"OriginalIndex"}, null, ExtraValues.Error), // 左连接空白行数据 MergedBlank = Table.NestedJoin(ReconstructedTable, {"OriginalIndex"}, BlankRows, {"OriginalIndex"}, "BlankRows", JoinKind.LeftOuter), // 左连接非空白行数据 MergedNonBlank = Table.NestedJoin(MergedBlank, {"OriginalIndex"}, NonBlankRows, {"OriginalIndex"}, "NonBlankRows", JoinKind.LeftOuter), // 提取Date列值:优先取非空白行,空白行保留原空值 AddDateColumn = Table.AddColumn(MergedNonBlank, "Date", each if [NonBlankRows] <> null then Table.First([NonBlankRows])[Date] else Table.First([BlankRows])[Date]), // 提取Book Title列值:逻辑同Date列 AddBookTitleColumn = Table.AddColumn(AddDateColumn, "Book Title", each if [NonBlankRows] <> null then Table.First([NonBlankRows])[Book Title] else Table.First([BlankRows])[Book Title]), // 移除所有辅助列 CleanedTable = Table.RemoveColumns(AddBookTitleColumn, {"OriginalIndex", "BlankRows", "NonBlankRows"}) in CleanedTable - 运行代码后,即可得到Date列非空单元格已升序排序、空白行位置与原始表格完全一致的结果。
简化替代方案(适用于空白行仅作分隔的场景)
如果空白行只是用来分隔不同日期的书籍标题,可采用更简洁的分组排序方式:
- 选中Date列,点击「转换」→「填充」→「向下」,得到
GroupDate列(非空Date会填充到下方空白行)。 - 按
GroupDate列升序排序,同时保留每组内的原始行顺序(Book Title的原有顺序不受影响)。 - 选中
GroupDate列,添加条件列:当原Date列为空时,将GroupDate设回空值,最终恢复原始空白状态。
内容的提问来源于stack exchange,提问作者maliebina
相关产品推荐
相关产品推荐

