'ClickHouse: groupArray inside groupArray

table

CREATE TABLE test
(
    uid UUID,
    agc Int64,
    stc Int8,
    oci Int32,
    sci Int32,
    fcd String,
    prc Float64
) engine = MergeTree()
ORDER BY (agc, oci);

base query

SELECT fcd, groupArray((agc, stc, oci, sci, (uid, prc))) as arr
FROM test
GROUP BY fcd;

next, I want to group groupArray by the first 4 values, like this (i know what groupArray cannot nest groupArray)

SELECT fcd, groupArray(groupArray(agc, stc, oci, sci)), (uid, prc))) as arr

example output

fcd groupArray(groupArray(agc, stc, oci, sci)), (uid, prc)))
'str' [(1, 1, 1, 2, [(id1, 10), (id2, 15)]), (1, 1, 1, 2, [(id3, 13), (id3, 11)])]


Solution 1:[1]

Try this query:

SELECT arrayJoin(arr_result) AS result
FROM 
(
    SELECT
        id,
        groupArray((v2, v3)) AS arr1,
        groupArray((v4, v5)) AS arr2,
        arrayMap(x -> (untuple(x), arr2), arr1) AS arr_result
    FROM 
    (
        SELECT
            number % 2 AS id,
            number AS v2,
            number AS v3,
            number AS v4,
            number AS v5
        FROM numbers(4)
    )
    GROUP BY id
)

/*
??result???????????????
? (0,0,[(0,0),(2,2)]) ?
? (2,2,[(0,0),(2,2)]) ?
? (1,1,[(1,1),(3,3)]) ?
? (3,3,[(1,1),(3,3)]) ?
???????????????????????
*/

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 vladimir