我想計算2行之間的時間差 - 但它有點棘手,然後通常。用戶在進入時收到temporally_id
。此ID不是唯一的 - 這意味着在此用戶離開後,只有在第一位用戶離開後,新用戶可能會得到相同的temporally_id
,但通常爲(請參閱下面的說明)。入口表看起來像這樣(entrance_states - 1:輸入,2:退出):mysql - 行時間差再次
| 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 |
所以基本上我想要一個時差。最棘手的部分是,有時,「退出」沒有被記錄 - 所以在表中,它看起來像狀態1在相同的temporally_id(這再次不正常並且不應該是)相同的狀態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
不幸的是,這是不是給我我需要什麼。
這是一個非常困難的問題,充滿了邊緣案例和異常情況。這是我會建議使用遊標編寫邏輯或在應用程序中少數幾次之一。 –
我建議在表中添加一個user_id,以便您可以確定它們何時離開,而不是通過數據流來推斷它。 –
不幸的是,我不能添加一個用戶ID給他們 - 至少不是在這一點 –