点击屋。如何创建一个保留另一列的最后一个值的列?
Posted
技术标签:
【中文标题】点击屋。如何创建一个保留另一列的最后一个值的列?【英文标题】:Clickhouse. How to create a column which preserves the last value from another column? 【发布时间】:2021-05-20 14:34:07 【问题描述】:我试图弄清楚如何在 Clickhouse 中创建一个名为“我想要的”的列,如下表所示:
Category | Row Number | What I have | What I want |
---|---|---|---|
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) 不支持它,而且它不可能很快更新。 p>
我想 clickhouse 数组应该有一些技巧。但我没有设法找到方法。有没有clickhouse-ninja可以给我提示如何处理它?
附言事实上,B 类不是零填充的,但我提供它只是为了简化我的问题。
【问题讨论】:
它适用于数组、邻居、窗口函数。问题不清楚如何理解“最新”是什么意思,SQL 中的行是无序的。 你有指定排序的列吗? 谢谢大家!是的,我忘了说有一个列对所有记录进行排序。在我的特殊情况下,有两个这样的列 user_id 和 timestamp 但让我们假设只有一个我称之为行号。 【参考方案1】: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 │
└────┴─────┴────┘
【讨论】:
非常感谢!试图弄清楚它是如何工作的)以上是关于点击屋。如何创建一个保留另一列的最后一个值的列?的主要内容,如果未能解决你的问题,请参考以下文章