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

ARRAY_CUM_SUM

array_cum_sum​

SinceVersion 2.0.0

Описание​

Вычисляет накопительную сумму массива. Функция обходит массив слева направо, вычисляя сумму всех элементов от начала до текущей позиции включительно, и возвращает новый массив той же длины, что и исходный.

Синтаксис​

array_cum_sum(ARRAY<T> arr)

Параметры​

  • arr: тип ARRAY<T>, массив, для которого нужно вычислить накопительную сумму. Поддерживаются имена столбцов и константные значения.

Поддерживаемые типы T:

  • Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL

Возвращаемое значение​

Тип возвращаемого значения: ARRAY<T>

Описание возвращаемого значения:

  • Возвращает новый массив той же длины, что и входной, в котором каждая позиция содержит сумму всех элементов исходного массива от начала до текущей позиции включительно
  • NULL: если входной массив равен NULL

Примечания по использованию:

  • Если массив содержит элементы других типов (например, строки), функция попытается преобразовать их в тип DOUBLE. Элементы, которые не удалось преобразовать, получат значение null.
  • Функция попытается преобразовать все элементы в совместимые числовые типы для вычисления накопительной суммы. Тип возвращаемого значения выбирается автоматически на основе входного типа:
    • Для входных значений типа DOUBLE или FLOAT возвращается ARRAY<DOUBLE>
    • Для входных значений целочисленного типа возвращается ARRAY<BIGINT> или ARRAY<LARGEINT>
    • Для входных значений типа DECIMAL возвращается ARRAY<DECIMAL> с сохранением исходной точности и масштаба
  • Накопительная сумма вычисляется слева направо; каждая позиция содержит сумму всех предшествующих элементов, отличных от null.
  • Для пустого массива возвращается пустой массив, для массива NULL возвращается NULL, а для массива с единственным элементом возвращается исходный массив.
  • Вложенные массивы, MAP, STRUCT и другие сложные типы не поддерживают вычисление накопительной суммы; вызов функции приведёт к ошибке.
  • Обработка значений null в элементах массива: начиная с первого значения, отличного от null, последующие значения null учитываются как 0 при вычислении накопительной суммы.

Примеры​

CREATE TABLE array_cum_sum_test (
id INT,
int_array ARRAY<INT>,
double_array ARRAY<DOUBLE>
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 3
PROPERTIES (
"replication_num" = "1"
);

INSERT INTO array_cum_sum_test VALUES
(1, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5]),
(2, [10, 20, 30], [10.5, 20.5, 30.5]),
(3, [], []),
(4, NULL, NULL);

Примеры запросов:

Накопительная сумма int_array: каждая позиция содержит сумму всех элементов от начала до текущей позиции включительно.

SELECT array_cum_sum(int_array) FROM array_cum_sum_test WHERE id = 1;
+-----------------------------+
| array_cum_sum(int_array) |
+-----------------------------+
| [1, 3, 6, 10, 15] |
+-----------------------------+

Накопительная сумма double_array: для массива чисел с плавающей точкой результат также содержит числа с плавающей точкой.

Обратите внимание, что результат во второй позиции равен 3.3000000000000003. Это связано с небольшой погрешностью, обусловленной точностью двоичного представления чисел с плавающей точкой. Числа 1.1 и 2.2 невозможно точно представить в двоичном формате с плавающей точкой (IEEE 754 double), поэтому они хранятся лишь приближённо. При их сложении погрешность накапливается, и получается 3.3000000000000003. Последующие накопительные суммы (например, 6.6, 11, 16.5) могут выглядеть как «обычные значения», но на самом деле они тоже приближённые и лишь после округления совпадают с десятичными значениями. Это явление встречается во всех системах, использующих числа с плавающей точкой IEEE 754 (включая MySQL, Snowflake, Python, JavaScript и другие).

SELECT array_cum_sum(double_array) FROM array_cum_sum_test WHERE id = 1;
+------------------------------------------+
| array_cum_sum(double_array) |
+------------------------------------------+
| [1.1, 3.3000000000000003, 6.6, 11, 16.5] |
+------------------------------------------+

При смешивании строк и чисел элементы, которые можно преобразовать в числа, участвуют в вычислении накопительной суммы. Элементы, которые преобразовать не удалось, получают значение null, а значение null при вычислении накопительной суммы учитывается как 0.

SELECT array_cum_sum(['a', 1, 'b', 2, 'c', 3]);
+-----------------------------------------+
| array_cum_sum(['a', 1, 'b', 2, 'c', 3]) |
+-----------------------------------------+
| [null, 1, null, 3, null, 6] |
+-----------------------------------------+

Для пустого массива возвращается пустой массив:

SELECT array_cum_sum(int_array) FROM array_cum_sum_test WHERE id = 3;
+-----------------------------+
| array_cum_sum(int_array) |
+-----------------------------+
| [] |
+-----------------------------+

Для массива NULL возвращается NULL: если входной массив равен NULL, функция возвращает NULL без ошибки.

SELECT array_cum_sum(int_array) FROM array_cum_sum_test WHERE id = 4;
+-----------------------------+
| array_cum_sum(int_array) |
+-----------------------------+
| NULL |
+-----------------------------+

Для массива с единственным элементом возвращается исходный массив:

SELECT array_cum_sum([42]);
+----------------------+
| array_cum_sum([42]) |
+----------------------+
| [42] |
+----------------------+

Массив со значениями null: начиная с первого значения, отличного от null, последующие значения null учитываются как 0 при вычислении накопительной суммы.

SELECT array_cum_sum([null, 1, null, 3, null, 5]);
+--------------------------------------------+
| array_cum_sum([null, 1, null, 3, null, 5]) |
+--------------------------------------------+
| [null, 1, 1, 4, 4, 9] |
+--------------------------------------------+

Примеры со сложными типами:

Тип вложенного массива не поддерживается, возникает ошибка.

SELECT array_cum_sum([[1,2,3]]);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_cum_sum(ARRAY<ARRAY<TINYINT>>)

Тип Map не поддерживается, возникает ошибка.

SELECT array_cum_sum([{'k':1},{'k':2}]);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_cum_sum(ARRAY<MAP<VARCHAR(1),TINYINT>>)

Тип Struct не поддерживается, возникает ошибка.

SELECT array_cum_sum(array(named_struct('name','Alice','age',20),named_struct('name','Bob','age',30)));
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_cum_sum(ARRAY<STRUCT<name:TEXT,age:TINYINT>>)

Неверное количество параметров приведёт к ошибке.

SELECT array_cum_sum([1,2,3],[4,5,6]);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not found function 'array_cum_sum' which has 2 arity. Candidate functions are: [array_cum_sum(Expression)]

Передача значения, тип которого не является массивом, приведёт к ошибке.

SELECT array_cum_sum('not_an_array');
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_cum_sum(VARCHAR(12))

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

ARRAY, CUM, SUM, CUM_SUM, ARRAY_CUM_SUM