我有一个表(让我们称之为WorkflowLog),其记录是关于工作流处理器的日志记录。 工作流处理器通过定义的流程图状态移动各种表(表1,表2等)中的记录。每个州都有一个号码。 WorkflowLog记录如下:
| ID | TimeStamp | TableN | RecordId | Action | OldState | NewState |
-------------------------------------------------------------------------------------------
| 1 | 2016-09-16 15:50:00 | Table1 | 21 | State Change | 0 | 10 |
| 2 | 2016-09-16 15:50:00 | Table1 | 21 | Other Info | 0 | 10 |
| 3 | 2016-09-16 15:55:00 | Table2 | 21 | State Change | 0 | 10 |
| 4 | 2016-09-16 15:57:00 | Table1 | 21 | State Change | 10 | 20 |
| 5 | 2016-09-16 15:58:00 | Table1 | 21 | State Change | 20 | 30 |
| 6 | 2016-09-16 15:59:00 | Table1 | 21 | State Change | 30 | 20 |
| 7 | 2016-09-16 16:00:00 | Table1 | 21 | State Change | 20 | 30 |
| 8 | 2016-09-16 16:01:00 | Table1 | 52 | State Change | 0 | 10 |
| 9 | 2016-09-16 16:02:00 | Table1 | 21 | State Change | 30 | 999 |
| 10 | 2016-09-16 16:03:00 | Table3 | 25 | State Change | 0 | 10 |
我想确定每个表状态所花费的时间。请注意,工作流程可以循环,以便记录可以多次处于状态20(或任何状态)。
我的第一次尝试是:
select
DFT1.ID as DFT1_Id,
DFT2.ID as DFT2_Id,
DFT1.TableN as TableName,
DFT1.RecordId as RecordId,
DFT1.OldState as State,
DFT2.Timestamp as EntryTime,
DFT1.TimeStamp as ExitTime,
TIMEDIFF(DFT1.TimeStamp, DFT2.Timestamp) as TimeInState
from WorkflowLog DFT1
inner join WorkflowLog DFT2
ON DFT1.TableN=DFT2.TableN AND
DFT1.RecordId=DFT2.RecordId AND
DFT1.`Action`='State Change' AND
DFT2.`Action`='State Change' AND
DFT1.OldState=DFT2.NewState
Order BY DFT1_Id
但是当记录在工作流程中循环时(记录6捕获),这不会处理。似乎我必须做一些类似于上面的内容但只匹配前一个最近的。 我对如何做到这一点感到茫然。
最终我想要的是输出,如:
| ID1 | ID2 | TableN | RecId | State | EntryTime | ExitTime | TimeInState |
------------------------------------------------------------------------------------------------
| 4 | 1 | Table1 | 21 | 10 | 2016-09-16 15:50:00 | 2016-09-16 15:57:00 | 00:07:00 |
| 5 | 4 | Table1 | 21 | 20 | 2016-09-16 15:57:00 | 2016-09-16 15:58:00 | 00:01:00 |
| 6 | 5 | Table1 | 21 | 30 | 2016-09-16 15:58:00 | 2016-09-16 15:59:00 | 00:01:00 |
| 7 | 6 | Table1 | 21 | 20 | 2016-09-16 15:59:00 | 2016-09-16 16:00:00 | 00:01:00 |
| 9 | 7 | Table1 | 21 | 30 | 2016-09-16 16:00:00 | 2016-09-16 16:02:00 | 00:02:00 |
ETC ...
修改 正如所建议的那样,我在第一次尝试SQL时添加了SqlFiddle for the above。 由于Table1记录21通过状态20和30两次,因此结果集中有额外的匹配。以下是我对SqlFiddle结果集的评论:
| ID | ID | My Comment |
| 4 | 1 | Good |
| 5 | 6 | Not Good - Matched with Future record |
| 5 | 4 | Good |
| 6 | 7 | Not Good - Matched with Future record |
| 6 | 5 | Good |
| 7 | 6 | Good |
| 7 | 4 | Not Good - Match to First time thru state 20 |
| 9 | 5 | Not Good - Match to First time thru state 30 |
| 9 | 7 | Good |