SQL上限,连续总和

时间:2017-02-01 18:56:21

标签: sql hana hana-sql-script

假设我们每个时间点有一个值的时间序列。我必须通过计算当前值+前一个值的总和来计算连续总和。然而,棘手的部分是,应该限制总和,因此不超过某个值。

实施例: 总和上限为+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脚本中解决此问题(这会非常慢)?

2 个答案:

答案 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

Sample Demo