QUERY. Большое число колонок

Недавно натолкнулся на задачу, в которой необходимо было посчитать минимумы для неопределенного числа колонок. Изменять структуру данных было жаль, т.к. массив был организован очень качественно. Поэтому я решил прибегнуть к модификации часто используемой формулы с QUERY
, ARRAYFORMULA
и COLUMN
. Под катом мой мемори дамп того, что получилось.
Области применения
Эта статья будет интересна тем, кто использует формулы массива и стремится к сокращению зависимостей между диапазонами до минимального количества формул.
Постановка задачи
Дано неизвестное количество колонок. Необходимо посчитать агрегатные функции для этих колонок. Например, минимумы
Формула для тех, кто все уже знает
=QUERY(
{B6:T15};
"select min(Col" & JOIN("), min(Col"; SEQUENCE(1;COLUMNS(B6:T15);1;1)) & ")";
0
)
Как это работает
Самой важной операцией в этом решении является конкатенация массива в запрос функции QUERY
с помощью JOIN
. Для построения последовательности используется SEQUENCE
=SEQUENCE(1;COLUMNS(B6:T6);1;1)
Аналог этой формулы
=ARRAYFORMULA(COLUMN(B6:T6)-1)
Построение запроса с JOIN
. В данном месте стоит обратить внимание на то, что агрегатная функция повторяется дважды из-за особенностей соединения строк.
="select min(Col" & JOIN("), min(Col"; B20:T20) & ")"
После подстановки формул вместо их диапазонов в формулу QUERY
получаем результат
=QUERY(
{B6:T15};
"select min(Col" & JOIN("), min(Col"; SEQUENCE(1;COLUMNS(B6:T15);1;1)) & ")";
0
)
Другие примеры
Для произвльного числа колонок в произвольной последовательности можно опустить использование SEQUENCE
, задавая колонки вручную. В данном примере считаются суммы только 19, 4, 1, 14, 9 колонок.
=QUERY({B7:T15};"select sum(Col" & JOIN("), sum(Col"; {19\4\1\14\9}) & ")"; 0)
Обрезать шапку можно с помощью INDEX
=INDEX(
QUERY({B7:T15};"select sum(Col" & JOIN("), sum(Col"; {19\4\1\14\9}) & ")"; 0);
2
)
Часто используемая формула с ARRAYFORMULA
имеет вид
=ARRAYFORMULA(QUERY(
{B6:T15};
"select sum(Col" & JOIN("), sum(Col"; COLUMN(B6:T6)-1) & ")";
0
))
Ссылки
- Справка SEQUENCE
- Примеры в Таблице . Можно сделать копию