在您的示例中,您想要的 begin 和 end 似乎分别是 min 和 max,我在方法中使用了它。
使用 Excel 2010+ 中提供的 Power Query 相对简单。
- 选择 ID、Order 和 Class 列
-
Group By
- 对于聚合有 min of begin;最大结束;和长度总和
- 将“类”列移回末尾
瞧!
这一切都可以通过 UI 快速完成
M 码
let
Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Begin", each List.Min([begin]), type number}, {"End", each List.Max([end]), type number}, {"Length", each List.Sum([length]), type number}}),
#"Reordered Columns" = Table.ReorderColumns(#"Grouped Rows",{"ID", "Order", "Begin", "End", "Length", "class"})
in
#"Reordered Columns"
为了完整起见:如果您确实需要为Begin 和End 使用每个组中的第一行和最后一行,而不是Min/Max,则可以使用以下代码。
在group by 步骤中,您选择All Rows 的聚合,而不是按最大/最小聚合开始/结束。这将创建一个表,其中包含每个组的开始和结束条目。然后,您可以使用 List.First 和 List.Last 函数提取第一个和最后一个条目。
自定义列的代码:
List.First(Table.Column([#"Start/End"],"begin"))
List.Last(Table.Column([#"Start/End"],"end"))
M 码
let
Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Length", each List.Sum([length]), type number}, {"Start/End", each _, type table [ID=number, Order=number, begin=number, end=number, length=number, class=number]}}),
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "Begin", each List.First(Table.Column([#"Start/End"],"begin"))),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "End", each List.Last(Table.Column([#"Start/End"],"end"))),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Start/End"}),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"ID", "Order", "Begin", "End", "Length", "class"})
in
#"Reordered Columns"
顺便说一句,您可以使用常规数据透视表非常接近(特别是如果您可以使用 Min/Max 作为开始/结束)。但是,它没有那么灵活,而且我认为您不能按照显示的方式对列进行排序。
下面是一个简单的数据透视表。
您将 ID、Order 和 class 拖到 Rows 区域。
您将 Begin、End 和 Length 拖动到应用 Min、Max 和 Sum 的值区域。
然后以表格形式显示布局;关闭总计和小计,你有: