插入一行而不更改表格

时间:2018-08-16 19:33:17

标签: sql sql-server

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
)

谢谢

2 个答案:

答案 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