插入行而不更改表

kpa*_*ark 1 sql sql-server

TL; DR:有没有办法将行插入到子查询产生的中间"视图"或"表"中?

背景:

我不允许在数据库中更改表(SQL Server 2014).

该表仅记录任务的开始时间,但对于另一个查询,我需要找出所有任务的开始时间和结束时间.我可以冒昧地完成他们之间没有休息的任务.

问题

通过在a.row = b.row - 1上使用JOIN,我能够获得最后一个任务之外的所有任务的开始时间和结束时间.

我需要检索所有任务的开始和结束时间,可能是在中间查询结果"table"或"view"中插入一行,其中时间戳为NOW().

输入表

TaskID    StartTime
-----------------------------
1         2018-08-10 03:00:00
2         2018-08-10 06:12:00
3         2018-08-11 07:13:00
Run Code Online (Sandbox Code Playgroud)

预期输出表

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)
Run Code Online (Sandbox Code Playgroud)

输出表

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
Run Code Online (Sandbox Code Playgroud)

当前的非工作代码

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
)
Run Code Online (Sandbox Code Playgroud)

谢谢,

Bri*_*ian 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
Run Code Online (Sandbox Code Playgroud)

  • @kpark我建议这种方法超过你接受的答案.更简单,更好的性能. (3认同)