使用上一行中的值来计算下一行中的值

时间:2017-06-21 11:04:17

标签: sql sql-server

我正在尝试创建一个报告,从上一行拉出日期,进行一些计算,然后在该行下面的行上显示答案。相关专栏是" Time Spent"。

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的日期完成

除了使用疯狂循环并使用行x行而不是set之外,我无法看到如何完成此操作。有没有人曾经在SQL中使用过这个逻辑?如果你是怎么做的?

提前致谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

您可以使用ROW编号语法

来完成此操作
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause)

供参考,您可以使用ROW_NUMBER

答案 2 :(得分:1)

你已经有一个索引(类似于上面的rownumber)。加入自己。

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