微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在clickhouse中对多列一个是数组进行聚合查询

如何解决在clickhouse中对多列一个是数组进行聚合查询

我正在尝试获取每个 att1 和 att2 列的聚合值,以及 att3 列中数组的每个值。

据我尝试:

create table test(value Float32,att1 String,att2 String,att3 Array(String))
 ENGINE=MergeTree() ORDER BY ();
INSERT INTO test VALUES (2.0,'a','Z',['sports','office','anothertag'])
INSERT INTO test VALUES (4.0,'b','X','tag'])
INSERT INTO test VALUES (6.0,'internet','planes'])
SELECT * from test;
┌─value─┬─att1─┬─att2─┬─att3───────────────────────────┐
│     6 │ b    │ X    │ ['sports','planes'] │
└───────┴──────┴──────┴────────────────────────────────┘
┌─value─┬─att1─┬─att2─┬─att3─────────────────────────────┐
│     2 │ a    │ Z    │ ['sports','anothertag'] │
└───────┴──────┴──────┴──────────────────────────────────┘
┌─value─┬─att1─┬─att2─┬─att3──────────────────────┐
│     4 │ b    │ X    │ ['sports','tag'] │
└───────┴──────┴──────┴───────────────────────────┘

我想获得每个不同属性的聚合 -sum(value)-。

我将它用于 att1 和 att2 列:

SELECT
    att1,att2,sum(value)
FROM test
GROUP BY
    att1,att2
    WITH CUBE

结果:

┌─att1─┬─att2─┬─sum(value)─┐
│ b    │ X    │         10 │
│ a    │ Z    │          2 │
└──────┴──────┴────────────┘
┌─att1─┬─att2─┬─sum(value)─┐
│ a    │      │          2 │
│ b    │      │         10 │
└──────┴──────┴────────────┘
┌─att1─┬─att2─┬─sum(value)─┐
│      │ Z    │          2 │
│      │ X    │         10 │
└──────┴──────┴────────────┘
┌─att1─┬─att2─┬─sum(value)─┐
│      │      │         12 │
└──────┴──────┴────────────┘

这比我需要的多,但结果二和三给出了正确的结果。

但我还需要 att3 上每个值的值,我在另一个查询中使用它,但是在尝试进行单个查询时:

SELECT
    att1,arrayJoin(att3) AS tags,tags
    WITH CUBE

提供(除其他外):

┌─att1─┬─att2─┬─tags─┬─sum(value)─┐
│ a    │      │      │          6 │
│ b    │      │      │         30 │
└──────┴──────┴──────┴────────────┘

┌─att1─┬─att2─┬─tags───────┬─sum(value)─┐
│      │      │ tag        │          4 │
│      │      │ anothertag │          2 │
│      │      │ planes     │          6 │
│      │      │ sports     │         12 │
│      │      │ internet   │          6 │
│      │      │ office     │          6 │
└──────┴──────┴────────────┴────────────┘

由于 arrayJoin 将数组“展开”成行,现在 att1 中 sum(value) 的值不准确。

我也尝试过 LEFT ARRAY JOIN 语法,结果相同。

更新:

理想的结果应该是:

┌─'att1'─┬─'att2'─┬─'tags'─┬─'sum(value)'─┐
│    a   │        │        │         2    │
│    b   │        │        │         10   │
│        │    X   │        │         10   │
│        │    Z   │        │         2    │
│        │        │ sports │         12   │
│        │        │ office │         6    │
│        │        │ anot.. │         2    │
│        │        │ tag    │         4    │
│        │        │internet│         6    │
│        │        │planes  │         6    │
└────────┴────────┴────────┴──────────────┘

可以在不同的行(结果)中,但最好在一个查询中。

解决方法

SELECT
    sumMap(([att1],[value])) AS r1,sumMap(([att2],[value])) AS r2,sumMap((att3,replicate(value,att3))) AS r3
FROM test
┌─r1─────────────────┬─r2─────────────────┬─r3──────────────────────────────────────────────────────────────────────────┐
│ (['a','b'],[2,10]) │ (['X','Z'],[10,2]) │ (['anothertag','internet','office','planes','sports','tag'],6,12,4]) │
└────────────────────┴────────────────────┴─────────────────────────────────────────────────────────────────────────────┘



SELECT
    (arrayJoin(arrayZip((arrayJoin([sumMap(([att1],[value])),att3)))]) AS r).1,r.2)) AS x).1 AS y,x.2 AS z
FROM test
┌─y──────────┬──z─┐
│ a          │  2 │
│ b          │ 10 │
│ X          │ 10 │
│ Z          │  2 │
│ anothertag │  2 │
│ internet   │  6 │
│ office     │  6 │
│ planes     │  6 │
│ sports     │ 12 │
│ tag        │  4 │
└────────────┴────┘
,

我认为更直接的方法是组合两个查询:

SELECT
    att1,att2,'' AS tags,sum(value)
FROM test
GROUP BY
    att1,att2
    WITH CUBE
UNION ALL
SELECT
    '' AS att1,'' AS att2,arrayJoin(att3) AS tags,sum(value)
FROM test
GROUP BY tags

/*
┌─att1─┬─att2─┬─tags───────┬─sum(value)─┐
│      │      │ internet   │          6 │
│      │      │ sports     │         12 │
│      │      │ office     │          6 │
│      │      │ tag        │          4 │
│      │      │ planes     │          6 │
│      │      │ anothertag │          2 │
└──────┴──────┴────────────┴────────────┘
┌─att1─┬─att2─┬─tags─┬─sum(value)─┐
│ b    │ X    │      │         10 │
│ a    │ Z    │      │          2 │
└──────┴──────┴──────┴────────────┘
┌─att1─┬─att2─┬─tags─┬─sum(value)─┐
│ a    │      │      │          2 │
│ b    │      │      │         10 │
└──────┴──────┴──────┴────────────┘
┌─att1─┬─att2─┬─tags─┬─sum(value)─┐
│      │ Z    │      │          2 │
│      │ X    │      │         10 │
└──────┴──────┴──────┴────────────┘
┌─att1─┬─att2─┬─tags─┬─sum(value)─┐
│      │      │      │         12 │
└──────┴──────┴──────┴────────────┘

*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。