首页 > 解决方案 > 点击屋。如何创建一个保留另一列的最后一个值的列?

问题描述

我试图弄清楚如何在 Clickhouse 中创建一个名为“我想要什么”的列,如下表所示:

类别 行号 我有的 我想要的是
一个 1 0 0
一个 2 1 1
3 0 1
4 0 1
一个 5 3 3
6 0 3
7 0 3
一个 8 2 2
9 0 2

有两个类别 A 和 B。我希望 B 类别“记住”A 类别的最新值。

有一个列对所有记录进行排序:行号。

我发现了一个看起来很有前途的函数arrayFill,但不幸的是,我的服务器版本 (19.14.11.16) 不支持它,而且它不可能很快更新。

我想clickhouse数组应该有一些技巧。但我没有设法找到方法。有没有 clickhouse-ninja 可以给我提示如何处理它?

ps 事实上,B 类别不是零填充的,但我提供它只是为了简化我的问题。

标签: sqlclickhouse

解决方案


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,0)('A',5,3)('B',6,0)('B',7,0)('A',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 │
└────┴─────┴────┘

推荐阅读