问题描述
我想弄清楚如何在 Clickhouse 中制作下表中名为“我想要”的列:
类别 | 行号 | 我有什么 | 我想要的 |
---|---|---|---|
A | 1 | 0 | 0 |
A | 2 | 1 | 1 |
B | 3 | 0 | 1 |
B | 4 | 0 | 1 |
A | 5 | 3 | 3 |
B | 6 | 0 | 3 |
B | 7 | 0 | 3 |
A | 8 | 2 | 2 |
B | 9 | 0 | 2 |
有两个类别A和B。 而且我希望 B 类别“记住”来自 A 类别的最新值。
有一列用于对所有记录进行排序:行号。
我发现了一个看起来很有希望的函数 arrayFill,但不幸的是,我的服务器版本 (19.14.11.16) 不支持它,而且它不可能很快更新。 >
我想 clickhouse 数组应该有一些技巧。但我没有设法找到方法。有没有clickhouse-ninja 可以给我一个提示如何处理它?
附言事实上,B 类别不是零填充,但我提供它只是为了简化我的问题。
解决方法
create table z(c String,rn Int64,hv Int64) Engine=Memory;
insert into z values ('A',1,0)('A',2,1)('B',3,0)('B',4,5,3)('B',6,7,8,2)('B',9,0);
select (arrayJoin(flatten(arrayMap( j -> arrayMap(m -> if(m.1 = 'B',(m.1,m.2,ga1[j-1][-1].3),m),ga1[j]),arrayEnumerate(arraySplit(k,i -> ga[i].1 <> ga[i-1].1,(groupArray( (c,rn,hv) ) as ga),arrayEnumerate(ga)) as ga1)))) as r).1 _c,r.2 _rn,r.3 _n
from (select * from z order by rn)
┌─_c─┬─_rn─┬─_n─┐
│ A │ 1 │ 0 │
│ A │ 2 │ 1 │
│ B │ 3 │ 1 │
│ B │ 4 │ 1 │
│ A │ 5 │ 3 │
│ B │ 6 │ 3 │
│ B │ 7 │ 3 │
│ A │ 8 │ 2 │
│ B │ 9 │ 2 │
└────┴─────┴────┘