-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

さて、これが私の試みです。ただし、最初の値 (「2」) が 1 で始まり、他の値ごとに 1 ずつ増加する Identity フィールド (「AddSequence」と呼びます) を追加する必要があります。

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 を指定すると、編集前に投稿した正確な出力が得られます。おそらくもっと良い方法がありますが、これは簡単で汚いです - 1 回限りのショットです。を使用しSELF JOINます。Differences は、もともと新しい列の名前でした。

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 に答える