一个表由三列组成(time,key,value)。任务是计算每个键的运行差异。所以,从输入
---------------
| time | key | value |
---------------
| 1 | A | 4 |
| 2 | B | 1 |
| 3 | A | 6 |
| 4 | A | 7 |
| 5 | B | 3 |
| 6 | B | 7 |
Run Code Online (Sandbox Code Playgroud)
希望得到
----------------------
| key | value | delta |
----------------------
| A | 4 | 0 |
| B | 1 | 0 |
| A | 6 | 2 |
| A | 7 | 1 |
| B | 3 | 2 |
| B | 7 | 4 |
Run Code Online (Sandbox Code Playgroud)
runningDifference功能。有效,如果密钥是固定的。所以我们可以
select *, runningDifference(value) from
(SELECT key, value from table where key = 'A' order by time)
Run Code Online (Sandbox Code Playgroud)
请注意,子查询是有必要在这里。当你想要得到这个不同的这个解决方案遭受键小号
groupArray。
select key, groupArray(value) from
(SELECT key, value from table order by time)
group by key
Run Code Online (Sandbox Code Playgroud)
因此,现在我们得到了一个键和带有该键的一系列元素。好。
但是如何计算滑动差呢?如果我们能够做到这一点,那么ARRAY JOIN将导致我们取得结果。
或者,我们甚至可以zip将数组本身与之匹配,然后应用lambda(对此我们必须arrayMap这样做),但是...我们zip别无选择。
有任何想法吗?提前致谢。
数组的解决方案:
WITH
groupArray(value) as time_sorted_vals,
arrayEnumerate(time_sorted_vals) as indexes,
arrayMap( i -> time_sorted_vals[i] - time_sorted_vals[i-1], indexes) as running_diffs
SELECT
key,
running_diffs
FROM
(SELECT key, value from table order by time)
GROUP by key
Run Code Online (Sandbox Code Playgroud)
其他选择(在每个组内分别进行排序,在很多情况下这是最佳选择)
WITH
groupArray( tuple(value,time) ) as val_time_tuples,
arraySort( x -> x.2, val_time_tuples ) as val_time_tuples_sorted,
arrayMap( t -> t.1, indexes) as time_sorted_vals,
arrayEnumerate(time_sorted_vals) as indexes,
arrayMap( i -> time_sorted_vals[i] - time_sorted_vals[i-1], indexes) as running_diffs
SELECT
key,
running_diffs
FROM
time
GROUP by key
Run Code Online (Sandbox Code Playgroud)
然后可以对结果应用ARRAY JOIN。
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |