я разобрался один из способов сделать это , код в M для запроса мощности ниже с комментариями по отдельным этапам:
let
// Data source
SourceTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Data = Table.TransformColumnTypes(SourceTable,{{"Role", type text}, {"From", type datetime}, {"To", type datetime}, {"Value", Int64.Type}}),
// Create table of all possible intervals
AllDates = Table.Sort(
Table.Distinct(
Table.Combine({
Table.RenameColumns(Table.SelectColumns(SourceTable, "From"), {"From", "Date"}),
Table.RenameColumns(Table.SelectColumns(SourceTable, "To"), {"To", "Date"})
})
), {{"Date", Order.Ascending}}
),
RenameFrom = Table.RenameColumns(
Table.AddIndexColumn(AllDates, "Index", 0, 1), {"Date", "From"}
),
AllIntervals = Table.RemoveRowsWithErrors(Table.AddColumn(RenameFrom, "To", each RenameFrom[From]{[Index] + 1})),
// Join Data with all possible intervals
InsertedCustom = Table.AddColumn(Data, "temp", each AllIntervals),
ExpandedTable = Table.ExpandTableColumn(InsertedCustom, "temp", { "From", "To" }, { "From2", "To2" }),
ExpandedTableWithValidValue = Table.AddColumn(ExpandedTable, "ValidValue", each (if ([From] < [To2] and [To] > [From2]) then [Value] else 0)),
ExpandedTableRevised = Table.RenameColumns(Table.RemoveColumns (ExpandedTableWithValidValue , { "Value", "From", "To" }) , { { "ValidValue", "Value" }, {"From2", "From"}, { "To2", "To" } }),
// Group and sum Data
#"Grouped Rows" = Table.Group(ExpandedTableRevised, List.RemoveItems(Table.ColumnNames(ExpandedTableRevised), { "Value" }), {{"Value", each List.Sum([Value]), type number}}),
#"Pivoted Column" = Table.Pivot(#"Grouped Rows", List.Distinct(#"Grouped Rows"[Role]), "Role", "Value", List.Sum),
#"Summed By Role" = Table.AddColumn(#"Pivoted Column", "Sum", each List.Sum(Record.ToList(Record.RemoveFields(_, { "From", "To" })))),
// Transpose data with intervals, values and sum to target result structure
ResultDataTable = Table.Transpose(#"Summed By Role"),
// Create First column with labels for result structure
FirstColumnRoles= Table.Distinct(Table.SelectColumns(SourceTable, "Role")),
FirstColumnWithFromToLabels = Table.InsertRows(FirstColumnRoles, 0, { [Role="From"], [Role="To"] }),
FirstColumnWithSum = Table.InsertRows (FirstColumnWithFromToLabels , Table.RowCount(FirstColumnWithFromToLabels), {[Role="Sum"]}),
FirstColumn = Table.AddIndexColumn(FirstColumnWithSum , "Index", 0, 1),
// Merge First column of labels with data structure and clean up redundant columns
ResultTable = Table.RemoveColumns(
Table.ReorderColumns(Table.Join(FirstColumn, "Index", Table.AddIndexColumn(ResultDataTable , "Index", 0, 1), "Index"), { "Index", "Role"}),
"Index"
),
Custom1 = ResultTable
in
Custom1
Для проверки вам потребуется источник «основных» интервалов. – Eugene
Спасибо, как я могу сгенерировать этот источник на основе доступных интервалов из двух разных наборов (A и B) в запрос мощности? Другими словами, мне нужно найти каждый случай перекрытия между двумя наборами интервалов. –