TL; DR:是否可以将行插入到子查询产生的中间“视图”或“表”中?
我不允许更改数据库中的表(SQL Server 2014)。
该表仅记录任务的开始时间,但是对于另一个查询,我需要找出所有任务的开始时间和结束时间。我可以自由地完成任务之间的工作。
我可以通过在a.row = b.row-1上使用JOIN来获取所有任务 EXCEPT 的开始时间和结束时间。
我需要检索所有任务的开始和结束时间,可能是通过在中间查询结果“表”或“视图”中插入一行,时间戳记为NOW()。
输入表
TaskID StartTime
-----------------------------
1 2018-08-10 03:00:00
2 2018-08-10 06:12:00
3 2018-08-11 07:13:00
预期的输出表
TaskID StartTime EndTime
----------------------------------------------------------
1 2018-08-10 03:00:00 2018-08-10 06:12:00
2 2018-08-10 06:12:00 2018-08-11 07:13:00
3 2018-08-11 07:13:00 2018-08-16 15:26:00 (now)
输出表
TaskID StartTime EndTime
----------------------------------------------------
1 2018-08-10 03:00:00 2018-08-10 06:12:00
2 2018-08-10 06:12:00 2018-08-11 07:13:00
WITH EnterTaskTimes AS (
SELECT ROW_NUMBER() OVER (ORDER BY StartTime ASC) TaskID
, [Timestamp] AS StartTime
FROM TaskLog
),
TaskTimes As (
SELECT
a.TaskID Task,
a.StartTime StartTime,
b.StartTime EndTime
FROM TaskLog a JOIN TaskLog b
ON a.TaskID = b.TaskID - 1
)
谢谢
答案 0 :(得分:5)
使用Lead()函数:
-- setup
Create Table Time_Lapse
(
TaskID Int
, StartTime DateTime
)
Insert Into dbo.Time_Lapse
(
TaskID
, StartTime
)
Select 1, '2018-08-10 03:00:00'
Union All Select 2, '2018-08-10 06:12:00'
Union All Select 3, '2018-08-11 07:13:00'
-- query
Select
tl.TaskID
, tl.StartTime
, Lead(tl.StartTime, 1, GetDate()) Over (Order By tl.StartTime) As EndTime
From dbo.Time_Lapse As tl
答案 1 :(得分:2)
如果没有尝试,我认为应该可以将原始表格“扩展”一行
...
Union
Select max(Taskid) as taskid , now() as StartTime
From TaskLog