我正在尝试创建一个报告,从上一行拉出日期,进行一些计算,然后在该行下面的行上显示答案。相关专栏是" 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中使用过这个逻辑?如果你是怎么做的?
提前致谢!
答案 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