使用 2 个数组聚合并保留贡献信息

Aggregate using 2 arrays and keep contribution information

问题

想要聚合行,但仍保留有关行如何影响最终总和的信息。

信息在两个数组中,但无法弄清楚如何聚合它并保留信息。

架构和示例数据(已简化)

CREATE TABLE A 
(
    Groupkey Int32,
    Sizename String,
    Givenqty Array(int),
    Category Array(int)
) Engine = Memory ;
                
INSERT INTO A VALUES (1, 'XS', [1], [154]);               
INSERT INTO A VALUES (1, 'M', [1], [154]);               
INSERT INTO A VALUES (1, 'L', [1], [154]);                
INSERT INTO A VALUES (1, 'XL', [1,1,2,1,1], [145,145,146,154,145]);

SELECT * FROM A:

想要的结果

我想要 1 个总和为“givenqty pr category”的行。

结果应该是:(145 = 3, 146 = 2, 154= 4):

在进行查询时,我知道“类别”列的可能结果,因此我们可以使用此信息按索引添加值(按类别编号排序)。

数据中的类别数量可以是随机的,但查询数据时可以知道完整的范围(如果解决方案需要,可以用作帮助数组)。

我尝试了不同种类的 groupArray、元组等,但似乎无法解决:/

尝试这样使用聚合函数sumMap

SELECT
    groupKey,
    sumMap(category, givenqty) AS summap,
    summap.2 AS result
FROM 
( 
    /* Emulate the test dataset. */
    SELECT
        data.1 AS groupKey,
        data.2 AS givenqty,
        data.3 AS category
    FROM 
    (        
        SELECT arrayJoin([(1, [1], [154]), (1, [1], [154]), (1, [1], [154]), (1, [1, 1, 2, 1, 1], [145, 145, 146, 154, 145])]) AS data
    )
)
GROUP BY groupKey

/*
┌─groupKey─┬─summap──────────────────┬─result──┐
│        1 │ ([145,146,154],[3,2,4]) │ [3,2,4] │
└──────────┴─────────────────────────┴─────────┘
*/