将列转入 ClickHouse 中的 NxM 表

问题描述

想象一下我有一张像

col_a  col_b col_c
one    a     1.0
one    b     2.0
two    a     3.0
two    b     4.0

我想把它变成

     a   b
one  1.0  2.0
two  3.0  4.0

我知道可以在 Postgres 中使用 crosstab 或在 Pandas 中使用 df.unstackdf.pivot

可以在 ClickHouse 中完成吗?

解决方法

create table t123(col_a String,col_b String,col_c Float64) Engine=Memory;

insert into t123 values('one','a',1.0),('one','b',2.0),('two',3.0),4.0);

select col_a,(sumMap( g.1,g.2 )) from (
select col_a,groupArray( (col_b,col_c) ) as g from t123 group by col_a)
group by col_a;

┌─col_a─┬─sumMap(tupleElement(g,1),tupleElement(g,2))─┐
│ two   │ (['a','b'],[3,4])                              │
│ one   │ (['a',[1,2])                              │
└───────┴────────────────────────────────────────────────┘



select col_a,arrayZip( (sumMap( g.1,g.2 ) as x).1,x.2) r from (
select col_a,col_c) ) as g from t123 group by col_a)
group by col_a;

┌─col_a─┬─r─────────────────┐
│ two   │ [('a',3),('b',4)] │
│ one   │ [('a',2)] │
└───────┴───────────────────┘
,

在 Postgres(使用 SQL 标准)中,您可以通过以下方式实现数据透视:

SELECT
    col_a,SUM(
       CASE WHEN col_b = 'a' THEN col_c 
           ELSE 0 
       END
    ) as a,SUM(
       CASE WHEN col_b = 'b' THEN col_c 
           ELSE 0 
       END
    ) as b
FROM mytable
GROUP BY col_a

我不喜欢 ClickHouse,但我想,有机会创建可以与聚合函数(如 CASEIFSUM、...在特定情况下一切正常。)