MySql - 加入self以确定状态

时间:2016-09-18 22:39:18

标签: mysql sql

我有一个表(让我们称之为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                                         |

0 个答案:

没有答案