我在 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 有可能吗?走到这一步,我的脑袋都疼了!
最佳答案
我最初认为,首先计算所有元素的总和直到每个排名,然后使用负元素以某种方式修复这些值会有所帮助。
但是,将 B
列清零的一个大负数将在总和中结转,并使所有后续元素都为负数。
正如 Gordon 评论的那样 - 0 是计算中的最大值 =MAX(0,B1+A2)
取决于它发生的先前位置并且似乎不可能提前分析计算它们.
关于sql - 在 Hive SQL 中引用计算列的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348620/