在Hive SQL中引用计算列的输出

3

我在Excel中有一个自引用/递归计算需要转移到Hive SQL。基本上,只有当具体列的总和加上前一次计算结果大于0时,该列才需要对两个值进行SUM

数据如下,A是值,B是预期输出:

|  A  |  B  |
|-----|-----|
|  -1 |  0  |
|  2  |  2  |
|  -2 |  0  |
|  2  |  2  |
|  2  |  4  |
|  -1 |  3  |
|  2  |  5  |

在Excel中,它将被写在B列中:
=MAX(0,B1+A2)

在SQL中的问题是你需要当前计算的输出。我认为我已经在SQL中解决了这个问题,代码如下:

DECLARE @Numbers TABLE(A INT, Rn INT)

INSERT INTO @Numbers VALUES (-1,1),(2,2),(-2,3),(2,4),(2,5),(-1,6),(2,7);

WITH lagged AS
(
    SELECT A, 0 AS B, Rn
    FROM @Numbers
    WHERE Rn = 1

    UNION ALL

    SELECT i.A, 
        CASE WHEN ((i.A + l.B) >= 0) THEN (i.A + l.B)
            ELSE l.B
        END, 
        i.Rn
    FROM @Numbers i INNER JOIN lagged l
    ON i.Rn = l.Rn + 1
)
SELECT *
FROM lagged;

但是由于这是Hive,它不支持公共表表达式(CTE),所以我需要简化SQL查询语句。使用LAG/LEAD函数能否实现?我已经很费劲地写到这个程度了!


我认为这种类型的计算需要递归CTE或类似的结构。你不能使用分析函数来实现它。问题在于断点(零点所在位置)是累积数据相关的。你不能仅仅提前计算出它们然后进行计算。 - Gordon Linoff
谢谢Gordon,这就是关键。我们可能需要使用CURSOR或在SQL中完成它... - Tim
1个回答

0

我最初认为,首先计算每个等级的所有元素之和,然后使用负元素修复值会有所帮助。

然而,一个大的负数将使B列归零并继续在总和中传递,并使所有后续元素变为负数。

正如Gordon所评论的那样-在计算=MAX(0,B1+A2)时,0是最大值,这取决于它发生的前一个位置,似乎不可能提前分析计算它们。


听起来很有趣,Alex,但是只有在计算结果加上负值大于0时,才应将负数包括在“SUM”中。可能会更困难... - Tim
哎呀,你说得对...让我想一想是否还能在不使用递归的情况下解决。 - Alex Libov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接