假设我们每个时间点有一个值的时间序列。我必须通过计算当前值+前一个值的总和来计算连续总和。然而,棘手的部分是,应该限制总和,因此不超过某个值。
实施例: 总和上限为+2。
+-----+---------+------------+
| row | measure | capped sum |
+-----+---------+------------+
| 1 | 1 | 1 |
| 2 | 3 | 2 |
| 3 | 4 | 2 |
| 4 | -2 | 0 |
| 5 | 1 | 1 |
+-----+---------+------------+
e.g。 "上限金额"第4行使用"上限和"来计算。从上一行" 2",并添加当前值。结果是< 2我们可以按原样取值。
问题是,对于HANA,我不能在"上限金额"上使用LAG / Window函数。领域。它会给我一个未知的专栏"错误。
如何在不使用for循环的情况下在SQL / HANA SQL脚本中解决此问题(这会非常慢)?
答案 0 :(得分:1)
此脚本首先创建一个运行总和的列。然后,它使用该列创建一个“超额”列,累计运行总和超过上限值的数量。然后它减去超额,以便在适当的情况下给出小于2的值。
DECLARE @capped_value INT = 2
;WITH CTE AS
(SELECT rowID,measure,
running_total = SUM(measure) OVER
(ORDER BY rowID ROWS UNBOUNDED PRECEDING)
FROM dbo.test_capped_sum)
,
CTE2 AS
(SELECT *,
overage_total = MAX(CTE.running_total)
OVER (ORDER BY rowID ROWS UNBOUNDED PRECEDING) - @capped_value
FROM CTE)
SELECT rowid,measure,
CASE WHEN CTE2.overage_total > 0
THEN CTE2.running_total- CTE2.overage_total
ELSE CTE2.running_total END
AS capped_sum FROM CTE2
答案 1 :(得分:1)
此解决方案使用HANA不支持的recursive-cte(根据OP)。发布适用于支持它的数据库的解决方案。
WITH ROWNUMS AS
(SELECT T.*,
ROW_NUMBER() OVER(ORDER BY ROW) AS RNUM
FROM T)
,RCTE AS
(SELECT ROW,
RNUM,
MEASURE,
MEASURE AS CAPPED_SUM
FROM ROWNUMS
WHERE RNUM=1
UNION ALL
SELECT RN.ROW,
RN.RNUM,
RN.MEASURE,
CASE
WHEN R.CAPPED_SUM+RN.MEASURE>=2 THEN 2
ELSE R.CAPPED_SUM+RN.MEASURE
END
FROM ROWNUMS RN
JOIN RCTE R ON R.RNUM=RN.RNUM-1 )
SELECT ROW,
MEASURE,
CAPPED_SUM
FROM RCTE