Доступ к ранее возвращенному значению от каждого? - PullRequest
1 голос
/ 23 мая 2019

В C # я могу написать что-то вроде этого:

int? valueForNewColumeInPreviousRecord = null;

myTable.AddColumn("New Column Name", (record) => {
                                        int newColumeValue;
                                        newColumeValue = valueForNewColumeInPreviousRecord.HasValue ?
                                                            valueForNewColumeInPreviousRecord.Value + record.SomeOtherValue : 
                                                            record.SomeOtherValue;

                                        valueForNewColumeInPreviousRecord = newColumeValue;

                                        return newColumeValue;
                                    } + 42);

ПРИМЕЧАНИЕ: Часть + 42, которая делает невозможным чтение / получение / доступ к последнему возвращенному значению из любой записи в таблице.

Как бы я поступил в Power Query? Или там есть совершенно другой способ делать такие вещи?

Меня не интересует фактическое добавление нового столбца в таблицу, но реальная концепция доступа к ранее возвращенным / вычисленным данным из лямбда-числа / каждого и, если возможно, как вы можете хранить данные в переменной.

Таблица - просто отличный конкретный пример, где вы можете захотеть сделать что-то подобное.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вы можете сделать это, но с большими столами очень медленно.Давайте посмотрим на пример с промежуточным итогом.

Возьмем таблицу с именем «Source» со столбцом «Значения» с номерами для накопления.

Первое, что нужно сделать, это добавить столбец индекса.

Indexed = Table.AddIndexColumn(Source, "Index"),

Затем, после вашего вопроса, добавляется новый столбец с именем «RunTot».Каждое значение этого нового столбца будет числом из «Значений» этой строки плюс предыдущий промежуточный итог («RunTot»).Уловка - это символ "@" перед этой частью "@Output [RunTot] {[Index] -1}", так вы вызываете предыдущий элемент столбца, который вы строите.

"try... иначе "это просто способ избежать ошибки, которую вы получаете при передаче отрицательного индекса в список.

Последнее," Table.Buffer "- это способ немного ускорить процесс мышления.

Output = Table.Buffer(Table.AddColumn(Indexed, "RunTot", each [Values] + (try @Output[RunTot]{[Index]-1} otherwise 0)))

Но, как предлагает Алексис, гораздо лучше подход "List.Generat".Это промежуточная функция с использованием List.Generate:

fnListGenerateRunningTotal = (Input as list) as list => 
List.Generate( 
        ()=> [Total = Input{0}, Counter = 0],
        each [Counter] < List.Count(Input),
        each [Total = Input{Counter} + [Total], Counter = [Counter] + 1],
        each [Total]
    )
0 голосов
/ 24 мая 2019

Я не уверен, но это выглядит очень похоже на то, что функции, такие как List.Accumulate и List.Generate позволяют вам сделать.

Этоочень похоже на циклы, в которых вы инициализируете и обновляете значения при переборе списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...