我正在尝试计算两行之间的时差-但这比平时有点棘手。用户进入时会收到temporally_id。此ID不是唯一的-这意味着该用户离开后,新用户可能会得到相同的temporally_id,但通常(请参阅下面的说明)仅在第一个用户离开后才能使用。入口表如下所示(entrance_states-1:enter,2:exit):

| temporally_id | entrance_state | entrance_date    |
-----------------------------------------------------
|    111        |       1        | 2017-01-01 10:20 |
|    222        |       1        | 2017-01-01 11:00 |
|    222        |       2        | 2017-01-01 11:20 |
|    222        |       1        | 2017-01-01 18:00 |
|    111        |       2        | 2017-01-01 21:00 |
|    111        |       1        | 2017-01-01 22:15 |
|    222        |       2        | 2017-01-02 01:00 |
|    111        |       2        | 2017-01-02 02:15 |


如您所见-用户也可以待在第二天。
我希望得到以下结果:

| temporally_id | entrance_date    | timediff |
-----------------------------------------------
|    111        | 2017-01-01 10:20 | 11,50 h  |
|    222        | 2017-01-01 11:00 |  0,33 h  |
|    222        | 2017-01-01 18:00 |  7,00 h  |
|    111        | 2017-01-01 22:15 |  4,00 h  |


所以基本上我想要一个时差。最棘手的部分是,有时没有记录“退出”-因此在表中,对于相同的temporal_id,状态1紧随其他状态1之后(这又是不正常的,也不应该是)。在那里,我必须考虑这种故障,并检查状态1是否跟随状态2。

这是我的SQL查询:

SELECT avg(TIMESTAMPDIFF(MINUTE,A.date,B.date)/60 ) as `diff`
FROM (SELECT
        entrance_date as date,
        temporally_id
        FROM `entrance`
        WHERE entrance_state = 1
        order by temporally_id asc, entrance_date asc ) A
LEFT JOIN
     (SELECT
        entrance_date as date,
        temporally_id
        FROM `entrance`
        WHERE  action_id = 2
        order by temporally_id asc, activity_date asc )
        B ON A.temporally_id = B.temporally_id


不幸的是,这没有给我我所需要的。

最佳答案

“ temporally_id”是对英语的滥用。您的意思是“ temporary_id”。

您将无法使该“ temporary_id”想法生效,因为您无法原子确定“ temporary_id”是否未使用并可以重复使用。因此,您将具有竞赛条件,其中大约同时输入的两个用户收到相同的“ temporary_id”。

无论如何,如果您坚持尝试,那么您需要通过消除尚未记录“退出”的情况来降低此问题的复杂性。因此,通过表一次,选择所有未记录“退出”的行,然后将其“退出”时间设置为“进入”时间加上20分钟。 (通常的Web会话超时。)

关于mysql - MySQL的-再次行时差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44609980/

10-13 00:58