查询以配对交错的开始和结束时间
Query to pair interleaved start and end times
我需要一个查询来将 'start' 和 'end' 次的交错数据配对成一个整洁的输出,但我的主要障碍是数据如何以交错格式存储在 ProcessTimertable.
输入table1
我有一个名为 ProcessTimer 的 table 三列。
- ProcessTimerId INT(主键)
- ProcessTimerDatetime DATETIME
- ProcessTimerAction VARCHAR(5)
- ProcessId INT(外键)
'ProcessTimerAction' 仅设置为值 'START' 或 'STOP',这与 'ProcessTimerDatetime' 列,因为 'ProcessTimerDatetime' 存储进程启动或停止时间的 DATETIME 值。
每个进程都通过 ProcessId 标识,并且链接到另一个名为 Process 的 table,其中包含一些详细信息关于每个进程。
输入table2
进程table设置如下:
- ProcessId INT(主键)
- 进程名称 VARCHAR(255)
- ProcessOwner VARCHAR(255)
从逻辑上讲,一个进程的 START 操作应该总是跟在一个 STOP 操作之后,并且成对显示,但是数据中的错误意味着并不总是每个 START 操作都有一个 STOP 操作。在这些情况下,我只能为缺少的 STOP 条目显示 NULL
期望输出
我希望用以下标题表示网格中的数据。
- ProcessOwner
- 进程名称
- ProcessStartTime
- ProcessEndTime
有没有人达到过这样的成就?
我不确定如何开始创建我需要的查询。
示例数据
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
我需要一个查询来将 'start' 和 'end' 次的交错数据配对成一个整洁的输出,但我的主要障碍是数据如何以交错格式存储在 ProcessTimertable.
输入table1
我有一个名为 ProcessTimer 的 table 三列。
- ProcessTimerId INT(主键)
- ProcessTimerDatetime DATETIME
- ProcessTimerAction VARCHAR(5)
- ProcessId INT(外键)
'ProcessTimerAction' 仅设置为值 'START' 或 'STOP',这与 'ProcessTimerDatetime' 列,因为 'ProcessTimerDatetime' 存储进程启动或停止时间的 DATETIME 值。
每个进程都通过 ProcessId 标识,并且链接到另一个名为 Process 的 table,其中包含一些详细信息关于每个进程。
输入table2
进程table设置如下:
- ProcessId INT(主键)
- 进程名称 VARCHAR(255)
- ProcessOwner VARCHAR(255)
从逻辑上讲,一个进程的 START 操作应该总是跟在一个 STOP 操作之后,并且成对显示,但是数据中的错误意味着并不总是每个 START 操作都有一个 STOP 操作。在这些情况下,我只能为缺少的 STOP 条目显示 NULL
期望输出
我希望用以下标题表示网格中的数据。
- ProcessOwner
- 进程名称
- ProcessStartTime
- ProcessEndTime
有没有人达到过这样的成就?
我不确定如何开始创建我需要的查询。
示例数据
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