sql - 点击屋。如何创建一个保留另一列的最后一个值的列?
问题描述
我试图弄清楚如何在 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 类别不是零填充的,但我提供它只是为了简化我的问题。
解决方案
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 │
└────┴─────┴────┘
推荐阅读
- python - 如何在对象创建期间设置字段值?
- javascript - 识别变量并转换为 int
- android - Android studio 3.2,Android SDK Tools 26.0.2 错误:Android 资源链接失败
- android - 在Android应用程序中检测信标而无需硬编码UUID
- django - 通过 AWS 最大限度地减少用户的延迟
- sql-server - 当年份会改变时,想要两个字段之间的每周差异
- macos - 如何使用 Swift 4 Xcode 10 从 Cocoa 的情节提要中以编程方式设置初始控制器?
- c# - 如何使用 IFileInfo 删除 ASP.NET Core 中的文件
- ember.js - EmberJS:自定义 Ember CLI 构建
- azure-active-directory - 尝试更新“mobilePhone”时 Microsoft Graph API 权限不足