与更新Presto sql中的值有关的有趣问题



我已经在Presto sql中尝试解决以下问题很长一段时间了,但似乎没有任何方法奏效。

假设我在下面的表中有两列XY输出是我想要的。

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中是否可能?对于这个问题,有什么可扩展的解决方法吗?

更新:我已经找到了一种通过以下步骤实现所需输出的方法

  1. 我使用array_agg和distinct。我还做了一个额外的列开始,它包含数组形式的最小值。此时的输出如下所示
X      A            start
dummy [1,2,3,4,5]   [1]
  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]
  • 下一步很明显,我们只需在使用array_displace后爆炸b,并在适当的条件下连接
  • 相关内容

    • 没有找到相关文章

    最新更新