我在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函数能否实现?我已经很费劲地写到这个程度了!
CURSOR
或在SQL中完成它... - Tim