如何透视分组?

时间:2019-09-12 16:31:10

标签: clickhouse

我们已经为Clickhouse创建了一个平面表,并正在尝试从该表中获取记录以创建实体化视图。逻辑是如果e_id为null,则记录为“ TypeB”,如果e_id不为null,则记录为“ TypeA”。 TypeA和TypeB记录将具有相同的p_id和s_id。我们想为每个p_id + s_id组合创建一条记录。

下面给出的查询在使用过滤器(p_id = 1和s_id = 1)时很好用,但没有过滤器-例外是“ DB :: Exception:标量子查询返回了多行” 是否可以在ClickHouse中执行此操作? 这样的查询是否可以创建实体化视图?

select p_id,s_id,
       groupArray(e_id),
       groupArray(name),
       (select groupArray(name) 
           from flat_table
           where e_id is null and p_id =1 and s_id = 1
           group by p_id,s_id) as typeB
       from flat_table
       where e_id is not null and p_id =1 and s_id = 1
       group by p_id,s_id;
/*
This what the table looks like:
Flat_table
p_id  s_id  e_id  name
1     1      1     Jake
1     1      2     Bob
1     1      null  Barby
1     1      null  Ella

This is expected result:
p_id  s_id  e_id  typeA        typeB
1      1    [1,2] [Jake,Bob]   [Barby,Ella]
*/

1 个答案:

答案 0 :(得分:0)

让我们尝试以下查询:

SELECT p_id, s_id, e_ids, typeA, typeB
FROM (
  SELECT
      p_id,
      s_id,
      groupArray((e_id, name)) eid_names,
      arrayMap(x -> x.1, arrayFilter(x -> not isNull(x.1), eid_names)) e_ids,
      arrayMap(x -> x.2, arrayFilter(x -> not isNull(x.1), eid_names)) typeA,
      arrayMap(x -> x.2, arrayFilter(x -> isNull(x.1), eid_names)) typeB
  FROM test.test_006
  GROUP BY p_id, s_id)
/* Result
┌─p_id─┬─s_id─┬─e_ids─┬─typeA────────────┬─typeB──────────────┐
│    2 │    2 │ [1,2] │ ['Jake2','Bob2'] │ ['Barby2','Ella2'] │
│    1 │    1 │ [1,2] │ ['Jake','Bob']   │ ['Barby','Ella']   │
└──────┴──────┴───────┴──────────────────┴────────────────────┘
*/

/* Data preparation queries */

CREATE TABLE test.test_006
(
    `p_id` Int32,
    `s_id` Int32,
    `e_id` Nullable(Int32),
    `name` String
)
ENGINE = Memory

INSERT INTO test.test_006
VALUES (1, 1, 1, 'Jake'), (1, 1, 2, 'Bob'), (1, 1, null, 'Barby'), (1, 1, null, 'Ella'),
  (2, 2, 1, 'Jake2'), (2, 2, 2, 'Bob2'), (2, 2, null, 'Barby2'), (2, 2, null, 'Ella2')