我需要一个查询将“开始”和“结束”时间的交错数据配对成一个整齐的输出,但我的主要障碍是如何在 ProcessTimer 中以交错格式存储数据表
输入表格1
我有一个名为 ProcessTimer 的表,有三列。
' ProcessTimerAction '只会设置为'START'或'STOP'值,它与' ProcessTimerDatetime '列相关联,因为' ProcessTimerDatetime '存储进程启动或停止时的DATETIME值。
每个流程都通过 ProcessId 进行识别,并链接到另一个名为流程的表,其中包含有关每个流程的一些详细信息。
输入表格2
流程表格设置如下:
逻辑上,进程的START操作应始终跟随STOP操作,并成对显示,但数据中的错误意味着每个START操作并不总是有STOP操作。在这些情况下,除了为缺少的STOP条目显示NULL之外,我无能为力
所需的输出
我希望用以下标题表示网格中的数据。
之前有没有人取得这样的成绩?
我不确定如何开始创建我需要的查询。
示例数据
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
答案 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