ARRAY_CUM_SUM
array_cum_sum
Описание
Вычисляет накопительную сумму массива. Функция обходит массив слева направо, вычисляя сумму всех элементов от начала до текущей позиции включительно, и возвращает новый массив той же длины, что и исходный.
Синтаксис
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