Как агрегировать тип массива в clickhouse - PullRequest
0 голосов
/ 23 февраля 2020

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

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]. Как это сделать?

1 Ответ

2 голосов
/ 23 февраля 2020

Для этого нужно использовать ForEach -агрегат агрегированных функций:

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] │
└───────────────┘
*/
...