-1

我在这样的列中有示例值:

    values 
    -------
    89    
    65    
    56    
    78    
    74   
    73    
    45    
    23    
    5    
    654   
    643   
    543   
    345   
    255   
    233   
    109   
    43    
    23    
    2    

值上升,然后下降到 0 并再次上升。我需要计算新列中行之间的差异以及所有值的这些差异的总和(累积总和)。值 56 和 5 是与零
的新差,总和为 819。底部示例> (23-2)+(43-23)+(109-43)+..+(654-643)+(5)+ (23-5)+..

4

4 回答 4

1

好的,这是我的尝试。但是,您需要添加一个 Identity 字段(我称之为“AddSequence”),该字段以 1 开头作为第一个值(“2”),每隔一个值递增 1。

SELECT SUM(C.Diff) FROM
(
 SELECT CASE WHEN (A.[Value] - (SELECT [Value] FROM [TestValue] AS B WHERE B.[AddSequence]= A.[AddSequence]-1)) > 0
    THEN (A.[Value] - (SELECT [Value] FROM [TestValue] AS D WHERE D.[AddSequence]= A.[AddSequence]-1))
    ELSE 0
    END AS Diff
 FROM [TestValue] AS A
) AS C

第一个解决方案我忽略了一个事实,即只要差异为负,我们就必须重新开始。

于 2012-06-14T21:56:06.623 回答
0

已编辑 - 基于您的问题编辑 (T-SQL) 我不知道如何在不添加 ID 的情况下执行此操作。如果您添加一个 ID - 这将提供您在编辑之前发布的确切输出。可能有更好的方法,但这既快速又肮脏-一次性拍摄。使用SELF JOIN. 差异最初是您的新列的名称。

UPDATE A
SET differences = CASE WHEN A.[values] > B.[Values] THEN A.[values] -  B.[Values]
ELSE A.[values] END
FROM SO_TTABLE A
JOIN SO_TTABLE B ON A.ID = (B.ID - 1)

输出

Select [Values], differences FROM SO_TTABLE 


   [values]     differences   
    ------------------------
    89          24             
    65           9            
    56          56             
    78           4             
    74           1            
    73          28             
    45          22             
    23          18              
     5           5              
   654          11           
   643         100            
   543         198           
   345          90            
   255          22            
   233         124            
   109          66             
    43          20             
    23          21              
     2           0              
于 2012-06-14T21:06:28.777 回答
0

我认为您正在寻找类似的东西:

SELECT SUM(a - b)) as sum_of_differences
FROM ...
于 2012-06-14T20:31:09.627 回答
0

我认为你想要这个差异,我已经在 sqlite 中测试过

SELECT CASE WHEN (v.value - val) < 0 THEN 0 ELSE (v.value - val) END AS differences
FROM v,
(SELECT rowid, value AS val FROM v WHERE rowid > 1) as next_val
WHERE v.rowid = next_val.rowid - 1

至于金额

SELECT SUM(differences) FROM
(
    SELECT CASE WHEN (v.value - val) < 0 THEN 0 ELSE (v.value - val) END AS differences
    FROM v,
    (SELECT rowid, value AS val FROM v WHERE rowid > 1) AS next_val
    WHERE v.rowid = next_val.rowid - 1
)
于 2012-06-14T22:16:59.360 回答