В вашем примере кажется, что вы хотите begin
и end
соответственно min
и max
, и я использовал это в подходе.
Относительно просто сделать с Power Query, доступный в Excel 2010 +.
- Выберите столбцы ID, Порядка и Класса
Group By
- Для агрегаций есть min начала; максимум конца; и сумма длины
- Переместить столбец класса обратно в конец
Вуаля!
Все это можно быстро сделать из пользовательского интерфейса
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-Code
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, Порядок и класс в область рядов. Вы перетаскиваете «Начало», «Конец» и «Длина» в область «Значения», применяя «Мин.», «Макс.» И «Сумма».
Затем отобразите макет в табличной форме; отключите общие итоги и промежуточные итоги, и вы получите: