在mysql中计算面板数据的时差
我有一张表(称为“Sessions”),看起来像这样:在mysql中计算面板数据的时差,mysql,time,panel-data,Mysql,Time,Panel Data,我有一张表(称为“Sessions”),看起来像这样: user_id | action | datetime 1 | 1 | 2015-12-06 20:15:46 1 | 2 | 2015-12-06 20:15:56 2 | 1 | 2015-12-06 10:01:36 2 | 2 | 2015-12-06 10:01:39 1 | 1 | 2015
user_id | action | datetime
1 | 1 | 2015-12-06 20:15:46
1 | 2 | 2015-12-06 20:15:56
2 | 1 | 2015-12-06 10:01:36
2 | 2 | 2015-12-06 10:01:39
1 | 1 | 2015-12-07 18:17:46
1 | 2 | 2015-12-07 18:17:56
2 | 1 | 2015-12-07 14:03:46
2 | 2 | 2015-12-07 14:03:49
我想使用mysql计算每个用户在每个活动上花费的秒数(“持续时间”),这是给定用户id在给定日期的datetime之差,得到:
user_id | action | datetime | duration
1 | 1 | 2015-12-06 20:15:46 | 10
1 | 2 | 2015-12-06 20:15:56 | NaN
2 | 1 | 2015-12-06 10:01:36 | 3
2 | 2 | 2015-12-06 10:01:39 | NaN
我可以让它为一个系列工作,但不是面板。谢谢大家! 解决方案包括两次交叉同一个表,一个对应于发生的“第一个动作”,另一个对应于“下一个动作”。然后,可以在查询的“on”部分表示这些条件:
select first_action.user_id,
first_action.action,
first_action.datetime,
(next_action.datetime - first_action.datetime) duration
from
(select * from sessions) as first_action
left outer join (select * from sessions) as next_action
on first_action.user_id = next_action.user_id
and first_action.action + 1 = next_action.action
and date(first_action.datetime) = date(next_action.datetime);
例如,像
SELECT x.user_id
, x.action
, x.datetime start
, y.datetime stop
, TIMEDIFF(y.datetime,x.datetime) duration
FROM my_table x
LEFT
JOIN my_table y
ON y.user_id = x.user_id
AND DATE(y.datetime) = DATE(x.datetime)
AND y.action = 2
WHERE x.action = 1
ORDER
BY user_id
, start;
是否根据给定用户id的操作1和操作2的日期时间差计算持续时间?是。我将修改我的问题。
选择session.action,session.datetime,(tableB.datetime-session.datetime)作为会话的持续时间,并将tableB.action=(session.action+1)按session.action排序代码>感谢大家的时间和帮助。这不起作用,因为你希望得到这些“NaN”:这意味着你正在穿过一张桌子,而另一边一无所有:因此需要一个左外连接或右外连接来完成此操作。op确实提到了“在给定的一天”。也许这可以用于解决我错过了这一部分,谢谢你让我知道。我将在一段时间内进行编辑,同时纠正这个问题是的,我应该更准确地写这个问题-对于给定的用户,在给定的一天。谢谢劳尔,我想我可以用这个。我现在就试试。