2017-06-21 106 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 
相关问题