2017-06-21 54 views
1

我想創建一個報告,從上一行中抽取日期,進行一些計算,然後在該行下方的行上顯示答案。有問題的列是「花費的時間」。使用前一行的值來計算下一行的值

E.g.我有3排。

 
+=====+===============+============+====+ 
|name | DatCompleted | Time Spent | idx| 
+=====+===============+============+====+ 
| A | 1/1/17  | NULL  | 0 | 
+-----+---------------+------------+----+ 
| B | 11/1/17 | 10 days | 1 | 
+-----+---------------+------------+----+ 
| C | 20/1/17 | 9 days  | 2 | 
+=====+===============+============+====+ 

花費時間的C C = DatCompleted - B

的DateCompleted

除了用一個瘋狂的循環,並用行X行,而不是一套的,我不能看到我會怎樣完成這個。有沒有人曾經在SQL中使用過這種邏輯?如果你是如何去做這件事的?

在此先感謝!

+1

使用'滯後()'函數: –

+1

請與實際RDBMS(產品和版本)標籤,請閱讀[如何問一個良好的SQL問題(http://meta.stackoverflow.com/問題/ 271055/tips-for-asking-a-good-structured-query-language-sql-question/271056)和[如何創建一個MCVE](http://stackoverflow.com/help/mcve) – Shnugo

回答

4

大多數數據庫支持ANSI標準LAG()功能。日期功能因在數據庫上,但這樣的事情:

select t.*, 
     (DateCompleted - lag(DateCompleted) over (order by DateCompleted)) as TimeSpent 
from t; 

在SQL Server中,你可以使用datediff()

select t.*, 
     datediff(day, 
       lag(DateCompleted) over (order by DateCompleted), 
       DateCompleted 
       ) as TimeSpent 
from t; 
+0

這工作完美。謝謝!! –

1

您可以通過使用行號語法做,這是

ROW_NUMBER () OVER ([ PARTITION BY value_expression , ... [ n ] ] order_by_clause) 

僅供參考,您可以使用ROW_NUMBER

+0

你可以嗎請舉例說明給定的問題。 –

1

您有一個指標已經(類似於以上ROWNUMBER)。加入自己。

Select table1.* 
    ,TimeSpent=DateDiff("d",table1.DateCompleted,copy.DateCompleted) 
from table1 
    join table1 copy on table.idx=copy.idx-1 
相關問題