clickhouse中的pivot或同等产品

v1l68za4  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(496)

我对clickhouse或任何专栏数据库都是新手。我需要像在sqlserver、postgres或任何其他基于行的数据库中那样透视表。
我正在寻找一个通用的解决方案,但解决方案的例子在这里会做得很好。
表:存储

Tag  Slot  Reading  
---  ---- --------      
A     1     5 
B     1     6  
C     1     1  
A     2     2       
B     2     8
C     3     2
.
.
millions of rows

转置到:

Slot  A   B   C   and so on  
---   --  --  --       
1     5   6   1
2     2   8   -  
3     -   -   2  
.
. 
and so on

标签可以在100到1000之间,插槽可以在1000到10000之间。但这不重要。
我只需要使用sql就可以了。
谢谢。

ie3xauqp

ie3xauqp1#

create table xxx (Tag String, Slot Int64, Reading Int64) Engine=Memory;
insert into xxx values 
('A',1,5),
('B',1,6), 
('C',1,1),  
('A',2,2),  
('B',2,8),
('C',3,2)

SELECT
    Slot,
    groupArray((Tag, Reading))
FROM xxx
GROUP BY Slot

┌─Slot─┬─groupArray(tuple(Tag, Reading))─┐
│    3 │ [('C',2)]                       │
│    2 │ [('A',2),('B',8)]               │
│    1 │ [('A',5),('B',6),('C',1)]       │
└──────┴─────────────────────────────────┘
snvhrwxg

snvhrwxg2#

select Slot, 
       sumIf(Reading, Tag='A') A,
       sumIf(Reading, Tag='B') B,
       ...
group by Slot
select Slot, arrayReduce('sumMap', [(groupArray(tuple(Tag,Reading)) as a).1], [a.2])
...
group by Slot
select Slot, groupArray(tuple(Tag, Reading))
from 
  (select Slot, Tag, sum(Reading) Reading
  ...
  group by Slot, Tag)
group by Slot

相关问题