我有一个如下图所示的列表
在上面的列表中,我们有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
答案 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的行。