【发布时间】:2010-08-06 14:19:17
【问题描述】:
这是我的表结构
MyTable
-----------
ObjectID int (Identity), -- Primary Key
FileName varchar(10),
CreatedDate datetime
...........
...........
...........
我需要获取在文件中创建记录所花费的时间...即...同一文件中的上一条记录与同一文件的当前记录之间经过的时间
ie...如果记录是
ObjectID FileName CreatedDate (just showing the time part here)
-------- -------- -----------
1 ABC 10:23
2 ABC 10:25
3 DEF 10:26
4 ABC 10:30
5 DEF 10:31
6 DEF 10:35
所需的输出是...
ObjectID FileName CreatedDate PrevRowCreatedDate
-------- -------- ----------- ---------------
1 ABC 10:23 NULL
2 ABC 10:25 10:23
3 DEF 10:26 NULL
4 ABC 10:30 10:25
5 DEF 10:31 10:26
6 DEF 10:35 10:31
到目前为止,我得到了这个查询,但它比预期花费了很长时间......有没有更好的方法来做到这一点......
Select A.ObjectID,
A.FileName
A.CreatedDate as CreatedDate,
B.PrevRowCreatedDate,
datediff("SS", '1900-01-01 00:00:00', Coalesce((A.CreatedDate - B.PrevRowCreatedDate),0)) as secondsTaken
from MyTable as A
Cross Apply (
(Select PrevRowCreatedDate = Max(CreatedDate) from MyTable as BB
where BB.FileName = A.FileName and
BB.CreatedDate < A.CreatedDate
)
) as B
如果您需要更多信息,请告诉我
谢谢
【问题讨论】:
-
你有
FileName, CreatedDate的索引吗? -
您是一次对一行执行此操作,还是对表中的所有行执行此操作?您是将其添加为新列,包括它作为返回集中的列,还是其他?表是小、大还是巨大(以 kb/mb/gb 为单位)?
-
很遗憾 SQL Server 还不支持 LEAD 和 LAG,尤其是现在它们是 ANSI...:/
-
@Martin,是的,列已编入索引,如果查询需要任何其他索引,我也可以这样做...
-
@Philip,我需要计算处理特定文件所花费的时间......但问题是,如果两行之间花费的时间超过 20 分钟,则必须从计算……(奇怪的要求,我同意)
标签: sql sql-server-2005 query-optimization