下一步很明显,我们只需在使用array_displace后爆炸b,并在适当的条件下连接
我已经在Presto sql中尝试解决以下问题很长一段时间了,但似乎没有任何方法奏效。
假设我在下面的表中有两列X和Y输出是我想要的。
X Y Output
dummy 1 1
dummy 2 1
dummy 3 3
dummy 4 3
dummy 5 5
逻辑是,我将第一行中的Y值设置为开始并向前看,如果所有后续行都在start+2内,则我将第一行将值指定为输出,否则我将用当前行的Y值更新开始值
例如,我们的初始起始值是1,因为第一行和第二行的值小于3(start+2(,所以我们为输出指定值1,但由于3不在标准范围内,起始值更新为3。
这在presto sql中是否可能?对于这个问题,有什么可扩展的解决方法吗?
更新:我已经找到了一种通过以下步骤实现所需输出的方法
- 我使用array_agg和distinct。我还做了一个额外的列开始,它包含数组形式的最小值。此时的输出如下所示
X A start
dummy [1,2,3,4,5] [1]
- 在这一点上,我使用presto的reduce函数。我从一开始取最后一个元素,并将其与数组的当前元素进行比较。如果差值<2我通过添加数组的最后一个元素来更新开始,否则我使用数组的当前元素,并将其存储在b中
reduce(A, start, case when x - s[cardinality(s)] < 2 then s || s[cardinality(s)] else s || x end, s-> s) as b
最终输出应如下所示。
X A start b
dummy [1,2,3,4,5] [1] [1,1,3,3,5]