
Описание
В этом уроке мы разберем функцию List.Generate и сделаем при помощи этой функции нарастающий итог, который будет самым быстрым нарастающим итогом из изученных нами.
Функция List.Generate представляет из себя цикл While. Цикл While выполняется до тех пор, пока условие истинно.
Разберем пример с нарастающим итогом.
Исходные данные: столбец с 50000 числовых значений.
Решение
Нам понадобится подключиться к этом столбцу и преобразовать его в список. Этот список нужно забуферовать при помощи List.Buffer.
Создать еще 1 пустой запрос в котором при помощи List.Count посчитать количество значений в списке с числами.
Далее вводим функцию List.Generate:
- Параметр ititial. В нашем случае введем запись, где index — это номер итерации, а total — это текущее значение нарастающего итога. Самый первый индекс — это 0, а первое значение нарастающего итога — это первое значение из списка с числами;
- Параметр condition. Показывает до каких пор выполняется цикл. Цикл выполняется до тех пор пока index < количества значений в списке с числами;
- Параметр next. Показывает, что должно произойти, если condition = true. В нашем случае нарастающий итог должен увеличиться на значение с индексом index из списка с числами.
Примененные функции
- List.Buffer
- List.Count
- List.Generate
- Table.FromList
- Splitter.SplitByNothing
- ExtraValues.Error
- Table.ExpandRecordColumn
Код
Подключаемся к источнику:
let
source = List.Buffer(
Excel.CurrentWorkbook(){[Name = "Числа"]}[Content][Числа]
)
in
source
Считаем количество элементов в исходном списке:
let
source = List.Count(Список)
in
source
Нарастающий итог:
let
source = List.Generate(
// Начальное положение: Индекс = 0, Сумма = первый элемент списка
() => [index = 0, total = Список{index}],
// Условие при котором выполняется действие: Если Индекс < Количества элементов в списке
each [index] < Счетчик,
// Если условие верно: Индекс увеличивается на единицу, а к Сумме прибавляется элемент списка с Индексом index
each [index = [index] + 1, total = [total] + Список{index}]
),
to_table = Table.FromList(
source,
Splitter.SplitByNothing(),
null,
null,
ExtraValues.Error
),
col_expand_records = Table.ExpandRecordColumn(
to_table,
"Column1",
{"index", "total"},
{"index", "total"}
)
in
col_expand_records