mysql - 计算时间差

标签 mysql sql

我有一个包含 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/

相关文章:

mysql - 如果未在 NOT NULL 枚举列上指定值,如何使 MariaDB 产生错误?

sql - 使用 REST API 的 Linq to SQL?

mysql - MySQL 中的公正查询

html - 将 HTML 表导出到 MySQL

sql - 复制 MySQL 数据库的最简单方法?

sql - 在 PostgreSQL 中,如何返回与最小值对应的整行?

php - 确认是否插入MySql数据库

mysql - Symfony2 中通过多个值对数据库中的记录进行排序

php - MySQL 在第 1 行错误的 '' 附近使用正确的语法

mysql - 在整个MySQL数据库中搜索日期 "0000-00-00 00:00:00"?