【问题标题】:Interesting problem concerned with updating a value in Presto sql与更新 Presto sql 中的值有关的有趣问题
【发布时间】:2022-01-24 22:24:46
【问题描述】:

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

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

X       Y   Output
dummy   1   1
dummy   2   1
dummy   3   3
dummy   4   3
dummy   5   5

逻辑是,我将第一行的 Y 值设置为 start 并向前看,如果所有后续行都在 start + 2 范围内,那么我将第一行值分配为输出,否则我更新 start值与当前行的 Y 值。

例如,我们的初始起始值为 1,因为第一行和第二行的值小于 3 (start + 2),因此我们为输出分配值 1,但由于 3 不在条件范围内,因此起始值更新为3.

在 presto sql 中甚至可能吗?是否有针对此问题的可扩展解决方法?

【问题讨论】:

  • 您如何知道各个行的顺序?我想你需要某种索引列吗?
  • @Aldert 顺序由 Y 列决定。与Y列的升序相同,随机打断。
  • 尽管如此,您仍将其视为 Excel 工作表。为什么 Y=1 是您计算的开始?如果我以2作为开始,结果就不同了..
  • 所以第一步是按Y asc排序。如果我们这样做,计算的开始和输出是固定的。

标签: sql algorithm hiveql presto


【解决方案1】:

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

  1. 我将array_agg 与不同的一起使用。我还创建了一个额外的列开始,其中包含数组形式的最小值。此时的输出将如下所示。
X      A            start
dummy [1,2,3,4,5]   [1]
  1. 此时,我使用presto的reduce功能。我从一开始就取最后一个元素,并将其与数组的当前元素进行比较。如果差异是
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]
  1. 下一步很明显,我们在使用 array_distinct 后简单地分解 b 并在适当的条件下加入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多