跳过已记录列表中同一用户的下一个12小时记录

时间:2018-09-26 08:02:53

标签: mysql sql mysqli

我有一个如下图所示的列表

enter image description here

在上面的列表中,我们有4个user_id 14条目

14:2018-09-26 06:09:18
14:2018-09-26 05:50:01
14:2018-09-25 14:29:27
14:2018-09-25 14:16:34

我担心的是,我需要从当前记录中跳过同一user_id的下一个12小时记录 例:对于user_id 14,仅需要为以下列表获取2条记录

14:2018-09-26 06:09:18
14:2018-09-25 14:29:27

14:2018-09-26 05:50:01记录不在结果集中,因为它在14:2018-09-26 06:09:18的12小时内

与其他所有用户相同。

请帮助我解决这个问题。

谢谢。

  

已使用sqlfiddel更新

我已经检查了Nick的查询,但这也不是我的要求。请检查http://sqlfiddle.com/#!9/da3f46/1/0小提琴。

根据Nick的查询,它仅显示两条记录

14  2018-09-26T23:09:56Z
14  2018-09-25T14:29:27Z

但是根据我的要求,我需要三条记录

14  2018-09-26T23:09:56Z
14  2018-09-26T06:50:56Z
14  2018-09-25T14:29:27Z

因为我们需要跳过2018-09-26T23:09:56Z记录的记录到2018-09-26T11:09:56Z

4 个答案:

答案 0 :(得分:3)

尝试一下:

select @idLag := 0, @dtLag := cast('2018-01-01' as datetime);
select user_id, created from (
    select case when (@idLag = user_id and timestampdiff(hour, created, @dtLag) >= 12) or @idLag <> user_id then user_id else null end user_id,
                 created,
                 @idLag := user_id,
                 @dtLag := created
    from my_table
    order by created desc
)a where user_id is not null

答案 1 :(得分:2)

此查询应执行您想要的操作。它会将您的user_times表连接到自身,该表的时间比上一个时间晚12小时。如果没有这样的时间,则输出该值。这是一个基于您的样本数据的简短测试用例:

DROP TABLE IF EXISTS user_times;
CREATE TABLE user_times (user_id INT, created DATETIME);
INSERT INTO user_times VALUES
(14, '2018-09-26 06:09:18'),
(14, '2018-09-26 05:50:01'),
(14, '2018-09-25 14:29:27'),
(14, '2018-09-25 14:16:34');
SELECT u1.*
FROM user_times u1
LEFT JOIN user_times u2 ON u2.user_id = u1.user_id AND
          u2.created BETWEEN u1.created + INTERVAL 1 SECOND AND u1.created + INTERVAL 12 HOUR
WHERE u2.user_id IS NULL

输出:

user_id     created
14          26.09.2018 06:09:18
14          25.09.2018 14:29:27

答案 2 :(得分:1)

此查询应该可以解决问题,它使用两个条件将表本身连接在一起,这两个条件是相同的用户ID和您所在时间的12小时间隔,因此很容易查询。

SELECT yt1.*
FROM yourTable yt1
LEFT JOIN yourTable yt2 ON yt2.user_id = yt1.user_id AND
          yt2.created BETWEEN yt1.created + INTERVAL 1 SECOND AND yt1.created + INTERVAL 12 HOUR
WHERE yt2.user_id IS NULL
AND yt1.user_id = 14

这是工作中的小提琴http://sqlfiddle.com/#!9/87b04/4

和DDL脚本,以防止小提琴链接断开:

create table temp(user_id int, created datetime);

insert into temp values (982, '2018-09-26 07:09:56');
insert into temp values (964, '2018-09-26 06:58:56');
insert into temp values (14,  '2018-09-26 06:09:56');
insert into temp values (14,  '2018-09-26 05:50:56');
insert into temp values (964, '2018-09-26 05:09:56');
insert into temp values (29,  '2018-09-26 05:01:56');
insert into temp values (596, '2018-09-26 04:50:42');

insert into temp values (10,  '2018-09-25 21:42:05');
insert into temp values (20,  '2018-09-25 16:11:58');
insert into temp values (10,  '2018-09-25 15:12:13');
insert into temp values (14,  '2018-09-25 14:29:27');
insert into temp values (14,  '2018-09-25 14:16:34');
insert into temp values (596, '2018-09-25 14:00:16');
insert into temp values (964, '2018-09-25 13:23:42');
insert into temp values (982, '2018-09-25 13:15:00');
insert into temp values (964, '2018-09-25 13:13:22');
insert into temp values (964, '2018-09-25 12:58:27');
insert into temp values (982, '2018-09-25 09:47:01');
insert into temp values (10,  '2018-09-25 06:38:32');

insert into temp values (11,  '2018-09-24 18:05:16');
insert into temp values (11,  '2018-09-24 16:13:39');
insert into temp values (10,  '2018-09-24 14:15:50');
insert into temp values (10,  '2018-09-24 14:15:23');
insert into temp values (10,  '2018-09-24 14:09:49');

答案 3 :(得分:0)

使用lag函数与上一行进行比较,并为两者之间的时差添加一列。

然后您可以从该表中仅选择时差大于或等于12的行。