【问题标题】: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 但让我们假设只有一个我称之为行号。

标签: sql clickhouse


【解决方案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 │
└────┴─────┴────┘

【讨论】:

  • 非常感谢!试图弄清楚它是如何工作的)
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2021-12-23
  • 1970-01-01
  • 2021-04-29
  • 2012-09-04
相关资源
最近更新 更多