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

时间:2017-02-21 10:22:32

标签: sql sql-server datetime report

我需要一个查询将“开始”和“结束”时间的交错数据配对成一个整齐的输出,但我的主要障碍是如何在 ProcessTimer 中以交错格式存储数据表

输入表格1

我有一个名为 ProcessTimer 的表,有三列。

  • ProcessTimerId INT(PRIMARY KEY)
  • ProcessTimerDatetime DATETIME
  • ProcessTimerAction VARCHAR(5)
  • ProcessId INT(FOREIGN KEY)

' ProcessTimerAction '只会设置为'START'或'STOP'值,它与' ProcessTimerDatetime '列相关联,因为' ProcessTimerDatetime '存储进程启动或停止时的DATETIME值。

每个流程都通过 ProcessId 进行识别,并链接到另一个名为流程的表,其中包含有关每个流程的一些详细信息。

输入表格2

流程表格设置如下:

  • ProcessId INT(PRIMARY KEY)
  • ProcessName VARCHAR(255)
  • ProcessOwner VARCHAR(255)

逻辑上,进程的START操作应始终跟随STOP操作,并成对显示,但数据中的错误意味着每个START操作并不总是有STOP操作。在这些情况下,除了为缺少的STOP条目显示NULL之外,我无能为力

所需的输出

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

  • ProcessOwner
  • ProcessName
  • ProcessStartTime
  • ProcessEndTime

之前有没有人取得这样的成绩?

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

示例数据

ProcessTimer

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

处理

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

1 个答案:

答案 0 :(得分:1)

这是一个实现:

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