点击屋。如何创建一个保留另一列的最后一个值的列?

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 │
└────┴─────┴────┘

【讨论】:

非常感谢!试图弄清楚它是如何工作的)

以上是关于点击屋。如何创建一个保留另一列的最后一个值的列?的主要内容,如果未能解决你的问题,请参考以下文章

求和列名称来自另一列的值的列

返回值的公式,其中一列中的第一个单词与另一列的最后四位匹配

基于另一列的每个值的列值总和,然后除以总数

尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列

SQL:根据另一列的值在列上保留一个具有最大值的行

应用 group_by 并汇总数据,同时保留所有列的信息