【问题标题】:Pivot column into NxM table in ClickHouse在 ClickHouse 中将列数据透视到 NxM 表中
【发布时间】:2021-05-07 11:39:48
【问题描述】:

想象一下我有一张这样的桌子

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 中完成吗?

【问题讨论】:

  • 你不应该用你不使用的数据库来标记问题。
  • 我删除了postgresql 标签,因为您似乎使用的是完全不同的 DBMS。

标签: sql pandas clickhouse


【解决方案1】:
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','a',3.0),('two','b',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','b'],[1,2])                              │
└───────┴────────────────────────────────────────────────┘



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

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

【讨论】:

    【解决方案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,但我想,有机会创建可以与聚合函数(如 SUMMAX、@987654326 @, ... 在特定情况下一切正常。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多