我有一个包含 4 个(相关列)的数据集:唯一 ID、user_id、time_stamp、事件。唯一id是主键,user_id可以重复,time_stamp(datetime)是事件发生时取的,事件是a)推送通知(push)或者b)用户打开应用(open)。
它看起来像这样:
id user_id time_stamp event count it?
1 1 10 open
2 1 23 push -good
3 1 28 open
4 1 38 push -bad
5 1 65 open
6 1 85 push -good
7 1 89 open
8 1 28 push -bad
9 2 38 push -good
10 2 45 open
11 2 46 open
我想知道我的推送通知是否有用。为此,我需要查看用户是否在收到推送通知后的 20 分钟内打开了该应用程序。我会将此视为“成功推送”,而所有其他推送都不会成功。到目前为止,我已经有了内部连接表的想法,但是我遇到了重复行的问题。例如,我们会得到 id 4 的误报,因为只应计算 id 3。
SELECT * FROM
(SELECT * FROM table WHERE row = 'open') a
INNER JOIN (SELECT * FROM table WHERE row = 'push') b
ON a.user_id = b.user_id) WHERE a.time_stamp - b.timestamp < 20;
最佳答案
因为同一个 user_id 有多个记录,所以我假设您想获取最新的“打开”time_stamp 并将其与每个用户的最新“推送”进行比较?
如果是这样,我认为以下内容可以满足您的需求(需要整理但应该可以解决问题):
SELECT et4.User_id, ts1, et3.User_id, ts2
FROM
(SELECT et1.user_id, max(et1.time_stamp) as ts1 from eventtable as et1
where et1.event = 'push'
group by et1.user_id
) as et4
INNER JOIN
(SELECT et2.user_id, max(et2.time_stamp) as ts2 from eventtable as et2
where event = 'open' group by et2.user_id) as et3
ON et3.user_id = et4.user_id
WHERE ts2 -ts1 < 20
基本上,为每个用户选择最新的推送并将其加入该用户的最新打开,然后计算时间戳的差异。
希望对您有所帮助。
关于mysql - 计算时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570495/