Пользовательская функция может выглядеть примерно так:
let
AddLastDateColumn = (someTable as table) as table =>
let
initialHeaders = Table.ColumnNames(someTable),
sorted = Table.Sort(someTable, {{"Date", Order.Ascending}, {"Name", Order.Ascending}}),
merged = Table.NestedJoin(sorted, {"Name"}, sorted, {"Name"}, "$joined", JoinKind.LeftOuter),
lastDateColumn = Table.AddColumn(merged, "Last Date", each
let
maxDate = [Date],
filtered = Table.SelectRows([#"$joined"], each [Date] < maxDate),
lastRow = if not Table.IsEmpty(filtered) then Table.Last(filtered)[Date] else null // Could use Table.Max, but data is already sorted.
in lastRow,
type nullable date),
dropColumns = Table.SelectColumns(lastDateColumn, initialHeaders & {"Last Date"})
in dropColumns
in
AddLastDateColumn
Если вы сохраните вышеупомянутое как собственный запрос, вы сможете получить к нему доступ в других запросах. Например, если вы сохраните вышеупомянутое в качестве запроса с именем AddLastDateColumn
, вы можете получить доступ к
это в других запросах (как показано ниже):
let
sourceTable =
let
nameColumn = {"A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", "G"},
dateColumn = {#date(2019,7,1), #date(2019,7,5), #date(2019,7,14), #date(2019,7,23), #date(2019,7,24), #date(2019,8,1), #date(2019,8,5), #date(2019,8,10), #date(2019,8,11), #date(2019,8,17), #date(2019,8,23), #date(2019,8,25), #date(2019,9,3), #date(2019,9,4), #date(2019,9,13), #date(2019,9,17), #date(2019,9,23), #date(2019,9,27), #date(2019,9,28), #date(2019,10,6), #date(2019,10,9)},
toTable = Table.FromColumns({nameColumn, dateColumn}, type table [Name = text, Date = date])
in toTable,
invokeFunction = AddLastDateColumn(sourceTable)
in
invokeFunction
Я искал документацию для Table.NestedJoin
(https://docs.microsoft.com/en-us/powerquery-m/table-nestedjoin). Кажется, есть параметр с именем keyEqualityComparers
:
Может быть включен необязательный набор keyEqualityComparers
, чтобы указать, как сравнивать ключевые столбцы.
У меня нет времени, чтобы изучить его возможности и синтаксис, который ему требуется, но, возможно, его можно использовать для более элегантного определения критериев JOIN: "Name
должно точно соответствовать. Right Date
должно быть наибольшая дата, которая меньше Left Date
".
В любом случае, я думаю, что вышеуказанная функция должна делать то, что вы искали.