2016-09-08 149 views
4

我有以下兩列。日期間的SQL計算

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

我想補充一點,在calulcate兩個日期之間Market Value的差異列。

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 Server?當是是哪一個? SQl Server 2008或2012等? – Nebi

+0

SQL SERVER 2012 .. – Haggan

+1

嘗試使用LEAD函數並按日期排序以查找下個月的市場價值,然後僅減去。 – dood

回答

0

對於2012以下的SQL服務器,你可以試試這個:

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 

原帖是從這裏開始:SQL difference between rows 對於SQL-Server 2012的和上面可以使用推薦的LEAD-功能。

0

如果你有連續日期,你可以做

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 

如果你沒有連續的日期和希望星期一至星期五計算diffrence你可以使用ROWNUM例如像這樣

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 

然後執行:

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