Как агрегировать тип массива в Clickhouse

Это примерная таблица

exampleTable:

   id | weeklyNumber |
   ---- -------------
   1  |  [2,5,9]     |
   ------------------
   2  |  [1,10,4]    |

Ожидаемые результаты должны быть результатом агрегирования массива weeklyNumber, который равен [3,15,13] (2 + 1, 5 + 10, 9 + 4).

Я не понимал, как это сделать.

----- update ---- Кроме того, у нас есть много строк из приведенной ниже таблицы exampleTable:

   id | weeklyNumber | monthlyNumber
   ---- ------------- -------------
   1  |  [2,5,9]     | [20,50,90] 
   --------------------------------
   2  |  [1,10,4]    | [10,100,40]  

результат должен быть [2/20 + 1/10, 5/50 + 10/100, 9/90 + 4/40]. Как это сделать?


person Peterxwl    schedule 23.02.2020    source источник
comment
Ответ был обновлен, чтобы охватить вторую часть вопроса.   -  person vladimir    schedule 24.02.2020


Ответы (1)


Необходимо использовать ForEach -aggregate. комбинатор функций:

SELECT sumForEach(weeklyNumber)
FROM
(
    SELECT
        1 AS id,
        [2, 5, 9] AS weeklyNumber
    UNION ALL
    SELECT
        2 AS id,
        [1, 10, 4] AS weeklyNumber
)
/*
┌─sumForEach(weeklyNumber)─┐
│ [3,15,13]                │
└──────────────────────────┘
*/

В некоторых случаях может использоваться такой запрос:

SELECT arrayReduce('sumForEach', groupArray(weeklyNumber))
FROM
(
    SELECT
        1 AS id,
        [2, 5, 9] AS weeklyNumber
    UNION ALL
    SELECT
        2 AS id,
        [1, 10, 4] AS weeklyNumber
)
/*
┌─arrayReduce('sumForEach', groupArray(weeklyNumber))─┐
│ [3,15,13]                                           │
└─────────────────────────────────────────────────────┘
*/

ОБНОВЛЕНИЕ

SELECT sumForEach(arrayMap((x, y) -> (x / y), weeklyNumber, monthlyNumber)) AS result
FROM
(
    SELECT
        1 AS id,
        [2, 5, 9] AS weeklyNumber,
        [20, 50, 90] AS monthlyNumber
    UNION ALL
    SELECT
        2 AS id,
        [1, 10, 4] AS weeklyNumber,
        [10, 100, 40] AS monthlyNumber
)
/*
┌─result────────┐
│ [0.2,0.2,0.2] │
└───────────────┘
*/
person vladimir    schedule 23.02.2020