我在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,因此我需要轻轻一蹴而过。这可能使用LAG / LEAD吗?到目前为止,我的大脑正在受伤!
答案 0 :(得分:0)
我最初认为,首先计算所有元素的总和直到每个等级,然后使用负面元素以某种方式修复值。
然而,一个将B
列归零的重大否定因素将在总和中继续存在,并将使所有后续元素为负。
正如戈登评论的那样 - 0是计算中的最大值=MAX(0,B1+A2)
取决于它发生的先前位置,并且似乎无法在分析前提前计算它们。