查询以配对交错的开始和结束时间

Query to pair interleaved start and end times

我需要一个查询来将 'start' 和 'end' 次的交错数据配对成一个整洁的输出,但我的主要障碍是数据如何以交错格式存储在 ProcessTimertable.

输入table1

我有一个名为 ProcessTimer 的 table 三列。

'ProcessTimerAction' 仅设置为值 'START' 或 'STOP',这与 'ProcessTimerDatetime' 列,因为 'ProcessTimerDatetime' 存储进程启动或停止时间的 DATETIME 值。

每个进程都通过 ProcessId 标识,并且链接到另一个名为 Process 的 table,其中包含一些详细信息关于每个进程。

输入table2

进程table设置如下:

从逻辑上讲,一个进程的 START 操作应该总是跟在一个 STOP 操作之后,并且成对显示,但是数据中的错误意味着并不总是每个 START 操作都有一个 STOP 操作。在这些情况下,我只能为缺少的 STOP 条目显示 NULL

期望输出

我希望用以下标题表示网格中的数据。

有没有人达到过这样的成就?

我不确定如何开始创建我需要的查询。

示例数据

ProcessTimer table

ProcessTimerId,ProcessTimerDatetime,ProcessTimerAction,ProcessId
1,1/1/2017 08:00:34,START,883
2,1/1/2017 08:03:76,STOP,883
3,1/1/2017 08:03:77,START,445
4,1/1/2017 08:03:79,START,636
5,1/1/2017 08:05:77,STOP,445
6,1/1/2017 08:07:34,START,445
7,1/1/2017 08:09:23,START,445
8,1/1/2017 08:12:61,STOP,636
9,1/1/2017 08:14:65,STOP,445

处理table

ProcessId,ProcessName,ProcessOwner
445,CTC hourlies,Sarah Parkes
636,Garage import,John Dean
883,DF task,Kate Duke

这是一种实现方式:

WITH ProcessTimerWithRowNum([ProcessId], [ProcessTimerAction], [ProcessTimerDatetime],[rno])
AS
( SELECT [ProcessId],
         [ProcessTimerAction],
         [ProcessTimerDatetime], 
         ROW_NUMBER() OVER(PARTITION BY ProcessId ORDER BY ProcessTimerId) AS [rno] 
  FROM  ProcessTime )

SELECT PT.[ProcessId], 
       P.[ProcessOwner], 
       P.[ProcessName], 
       PT.[ProcessTimerDatetime] AS StartTime, 
       DPT.ProcessTimerDatetime AS EndTime FROM

ProcessTimerWithRowNum PT 

LEFT JOIN

ProcessTimerWithRowNum DPT

ON PT.ProcessId = DPT.ProcessId  AND DPT.ProcessTimerAction = 'STOP' AND DPT.rno = PT.rno + 1

INNER JOIN Process P ON PT.ProcessId = P.ProcessId

WHERE PT.ProcessTimerAction = 'START'

以上数据的输出:

ProcessOwner | ProcessName | StartTime | EndTime  

445 |Sarah Parkes|  CTC hourlies|   1/1/2017 08:03:77|  1/1/2017 08:05:77

445 |Sarah Parkes|  CTC hourlies|   1/1/2017 08:07:34|  NULL

445 |Sarah Parkes|  CTC hourlies|   1/1/2017 08:09:23|  1/1/2017 08:14:65

636 |John Dean| Garage import|  1/1/2017 08:03:79|  1/1/2017 08:12:61

883 |Kate Duke| DF task|    1/1/2017 08:00:34|  1/1/2017 08:03:76