我正在尝试计算两行之间的时差-但这比平时有点棘手。用户进入时会收到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/