2016-09-08 21 views
4

次の2つの列があります。日付間のSQL計算

Date  | Market Value 
------------------------------ 
2016-09-08 |  100 
2016-09-07 |  130 
2016-09-06 |  140 
2016-09-05 |  180 

私は2つの日付の間Market Valueの違いをcalulcate列を追加します。

Date  | Market Value | Delta 
------------------------------------------ 
2016-09-08 |  100   | -30 
2016-09-07 |  130   | -10 
2016-09-06 |  140   | -40 
2016-09-05 |  180   | 

100 (2016-09-08) minus 130 (2016-09-07) = -30 

この機能はどのように記述しますか?

+0

あなたは、SQLサーバーを使用していますか?はいの場合はどちらですか? SQl Server 2008または2012など? – Nebi

+0

SQL SERVER 2012 .. – Haggan

+1

LEAD関数を使用し、次の月の市場価値を見つけるために日付順に試してみてください。 – dood

答えて

0

2012以下のSQL-Serverの場合は、これを試みることができる:

with cte as 
(SELECT 
    ROW_NUMBER() OVER (ORDER BY [Date] DESC) row, 
    [Date], 
    [Market Value] 
FROM [YourTable]) 
SELECT 
    a.[Date] , 
    b.[Market Value] - ISNULL(a.[Market Value],0) AS Delta 
FROM 
    cte a 
    LEFT JOIN cte b 
    on a.row = b.row+1 

オリジナルのポストはここからです:あなたは推奨LEAD-機能を使用することができますSQL difference between rows SQL-Server 2012のためにとの上。

0

あなたは連続日付を持っていけないし、月曜日と金曜日の間diffrenceを計算したい場合は、連続日付を持っている場合は、

select t1.date, t1.market_value, t1.market_value-t2.market_value from data_table t1 left join data_table t2 on t1.date-1=t2.date 

を行うことができますが、この

select t1.date, t1.market_value, t1.market_value-t2.market_value from (select rownum, date,market_value from data_table) t1 left join (select rownum, date,market_value from data_table) t2 on t1.rownum-1=t2.rownum 
0
CREATE PROCEDURE UPDATE_DELTA 
@START_DATE DATETIME, 
@END_DATE DATETIME 
AS BEGIN 

    UPDATE T 
    SET DELTA = MARKET_VALUE - (SELECT MARKET_VALUE 
           FROM YOURTABLE 
           WHERE [DATE] = T.[DATE] - 1) 
    FROM YOURTABLE T 
    WHERE [DATE] BETWEEN @START_DATE AND @END_DATE 

END 
のように、たとえば、ROWNUMを使用することができます

実行する:

EXEC UPDATE_DELTA '2016-09-05', '2016-09-08' 

シーケンスされた日付がある限り、これは機能します。

+0

計算された値を(他の列から)格納するのは本当に良い考えではありません。誰かが値を更新/削除/挿入するときにあなたが知っているデータの矛盾。 – jarlh

3

SQL Server 2012+では、最も効率的で簡単な方法は、組み込みのLEAD関数を使用することです。

SELECT 
    [Date] 
    ,[Market Value] 
    ,LEAD([Market Value]) OVER (ORDER BY [Date] DESC) - [Market Value] AS Delta 
FROM YourTable 
; 

LEADそのORDER BY句で指定された次の行の値を返します。

テーブルを自己結合する他のすべての方法は効率が悪いです。

0

は、次のように列や更新を追加します。

UPDATE t SET t.Delta = t.Market_Value-t2.Market_Value 
FROM yourtable t 
INNER JOIN yourtable t2 ON DATEADD(DD,-1,t.Date) = t2.Date 
+0

計算された値を(他の列から)格納するのは本当に良い考えではありません。誰かが値を更新/削除/挿入すると、あなたが知っているデータの不一致。 – jarlh

+0

はい、ありがとう、私は同意するが、これは上記の要件の解決のためだけですが、私はそれを残念に私のクエリで言及する必要があります。 – Susang