Перейти к содержимому
Последнее обновление

FOREACH

Описание​

Преобразует агрегатную функцию для таблиц в агрегатную функцию для массивов, которая агрегирует соответствующие элементы массивов и возвращает массив результатов. Например, sum_foreach для массивов [1, 2], [3, 4, 5] и [6, 7] возвращает результат [10, 13, 5] после сложения соответствующих элементов массивов.

Синтаксис​

AGGREGATE_FUNCTION_FOREACH(arg...)

Пример​

Подготовьте данные для примера:

CREATE TABLE db (
id INT,
a ARRAY<INT>,
s ARRAY<STRING>
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES ("replication_num" = "1");

INSERT INTO db VALUES
(1, [1, 2, 3], ["ab", "123"]),
(2, [20], ["cd"]),
(3, [100], ["efg"]),
(4, NULL, NULL),
(5, [null, 2], [null, "c"]);

Затем выполните вызовы с комбинаторами FOREACH:

mysql [test]>select a , s from db;
+-----------+---------------+
| a | s |
+-----------+---------------+
| [1, 2, 3] | ["ab", "123"] |
| [20] | ["cd"] |
| [100] | ["efg"] |
| NULL | NULL |
| [null, 2] | [null, "c"] |
+-----------+---------------+

mysql [test]>select sum_foreach(a) from db;
+----------------+
| sum_foreach(a) |
+----------------+
| [121, 4, 3] |
+----------------+

mysql [test]>select count_foreach(s) from db;
+------------------+
| count_foreach(s) |
+------------------+
| [3, 2] |
+------------------+

mysql [test]>select array_agg_foreach(a) from db;
+-----------------------------------+
| array_agg_foreach(a) |
+-----------------------------------+
| [[1, 20, 100, null], [2, 2], [3]] |
+-----------------------------------+

mysql [test]>select map_agg_foreach(a,a) from db;
+---------------------------------------+
| map_agg_foreach(a, a) |
+---------------------------------------+
| [{1:1, 20:20, 100:100}, {2:2}, {3:3}] |
+---------------------------------------+

Примечания​

  • Каждый аргумент должен быть массивом ARRAY, тип элементов которого совпадает с типом соответствующего аргумента вложенной агрегатной функции. Результатом является ARRAY с типом элементов, соответствующим типу возвращаемого значения вложенной функции; вычисление выполняется отдельно для каждой позиции.
  • Если в один вызов передаётся несколько аргументов-массивов, все массивы в одной строке должны иметь одинаковую длину; в противном случае запрос завершается ошибкой Arrays passed to <function> aggregate function have different sizes. (Длины массивов в разных строках могут отличаться.)
  • Функции percentile, percentile_array, percentile_approx и percentile_approx_weighted не поддерживаются с комбинатором foreach.

Ключевые слова​

FOREACH