You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SELECT ts, arraySum(arraySlice(total, 1, i)) as total_num
FROM (
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
)
ARRAY JOIN
t as ts,
arrayEnumerate(total) as i
STEP1:groupArray
里面除了SQL的基本语法之外,主要有4个看着就蛋疼的Clickhouse函数。我们从最内层往外看。
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
SELECT t, total
FROM (
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
) ARRAY JOIN t
SELECT t, total, ts
FROM (
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
) ARRAY JOIN t as ts
使用了alias的话,t就变成了数组的引用,ts就变成了数组元素的引用
t
total
ts
[1,2,3,4,5]
[10,5,3,10,5]
1
[1,2,3,4,5]
[10,5,3,10,5]
2
[1,2,3,4,5]
[10,5,3,10,5]
3
[1,2,3,4,5]
[10,5,3,10,5]
4
[1,2,3,4,5]
[10,5,3,10,5]
5
STEP4:arrayEnumerate
arrayEnumerate这个方法就和row_number()一样,简单理解就是返回行号。
SELECT t, total, ts, i
FROM (
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
) ARRAY JOIN
t as ts,
arrayEnumerate(total) as i
SELECT ts, arraySum(arraySlice(total, 1, i)) as total_num
FROM (
SELECT
groupArray(ts) as t,
groupArray(amount) as total
FROM (
SELECT ts, amount
FROM [表名]
WHERE ts >= [开始时间]
AND ts <= [结束时间]
)
)
ARRAY JOIN
t as ts,
arrayEnumerate(total) as i
点开文章的朋友们可以先看看讲的是不是你要的效果
初始数据:假设我们的表如下所示,时间戳(ts)我简化成了1到5的数字。
处理结果:SQL执行完想变成这样
我先放最终的完整SQL,然后再解释里面让人迷茫的Clickhouse函数。
STEP1:groupArray
里面除了SQL的基本语法之外,主要有4个看着就蛋疼的Clickhouse函数。我们从最内层往外看。
这个SQL中groupArray比较陌生。这函数简单来说就是把列转成行,执行后的效果就是
STEP2:ARRAY JOIN
接下来只看
ARRAY JOIN
和arrayEnumerate
,我把SQL中只保留ARRAY JOIN
。ARRAY JOIN
的主要作用是把数组展开STEP3:带alias的ARRAY JOIN
原始SQL中还带了alias有啥用?当我们
ARRAY JOIN t
的时候,t
在SQL中就代表了数组中的元素,而不是数组本身。那如果在查询结果中既包含元素、也包含数组本身怎么办?就得再加上alias了。s使用了alias的话,
t
就变成了数组的引用,ts
就变成了数组元素的引用STEP4:arrayEnumerate
arrayEnumerate
这个方法就和row_number()
一样,简单理解就是返回行号。查询结果如下:
STEP5:arraySlice和arraySum
那我们绕这么一圈对咱们的目标有啥帮助呢?憋着急,这时候就要用到
arraySlice
和arraySum
。我们再看看我们现在已经查询出来的结果。大家可能已经发现了,根据我们现有的数据,已经能从单行的数据中计算目标数据:
咱们利用Clickhouse的函数就可以做这种处理:
arraySlice
:截断数组,arraySlice(数组变量名称, 开始下标, 结束下标),注意开始下标从1开始,并且区间左闭右开[开始下标, 结束下标)。arraySum
:将数组中所有元素做加和。所以咱们再看看这个SQL,截断每个total数组,截取到行号
i
的前一位。然后把数组加起来。最终获得结果就是
结尾
做
按时间累加
这个SQL第一次写的话我觉得还是挺绕的,大家可以把Clickhouse函数和细节放一边,先记忆查询结果的处理过程。The text was updated successfully, but these errors were encountered: