假设一个时间序列,其中每个时间点都有一个值。我必须通过计算当前值+先前值的总和来计算连续总和。然而,棘手的是,总和应加上限,因此不得超过某个值。

例:
总和不得超过+2。

+-----+---------+------------+
| row | measure | capped sum |
+-----+---------+------------+
|   1 |       1 |          1 |
|   2 |       3 |          2 |
|   3 |       4 |          2 |
|   4 |      -2 |          0 |
|   5 |       1 |          1 |
+-----+---------+------------+


例如使用上一行“ 2”中的“上限和”,并加上当前值,计算第4行的“上限和”。由于结果
问题是,对于HANA,我不能在“上限金额”字段上使用LAG / Window函数。这会给我一个“未知列”错误。

有什么想法如何在不使用for循环的情况下在SQL / HANA SQL脚本中解决此问题(这会非常慢)?

最佳答案

此解决方案使用HANA不支持的递归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


Sample Demo

10-08 06:44