Пропустить следующие 12 часов записи для того же пользователя в списке записей - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть список, подобный изображению ниже

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

Меня беспокоит то, что мне нужно пропустить следующие 12 часов записи из текущей записи для того же user_id. EX: Для 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записей нет в наборе результатов, потому что это через 12 часов 14:2018-09-26 06:09:18

То же самое для всех других пользователей.

Пожалуйста, помогите мне в этом вопросе.

Заранее спасибо.

Обновлено с sqlfiddel

Я проверил запрос Ника, но он также не соответствует моему требованию.Пожалуйста, отметьте http://sqlfiddle.com/#!9/da3f46/1/0 fiddle.

Согласно запросу Ника, он показывает только две записи

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-26T11: 09: 56Z для записи 2018-09-26T23: 09: 56Z

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Этот запрос должен сработать, он объединяет таблицу с двумя условиями, то есть с одним и тем же идентификатором пользователя и 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');
0 голосов
/ 26 сентября 2018

Этот запрос должен делать то, что вы хотите.Он присоединяет вашу таблицу 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
0 голосов
/ 26 сентября 2018

Попробуйте это:

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
0 голосов
/ 26 сентября 2018

Используйте функцию запаздывания для сравнения с предыдущей строкой и добавьте столбец для разницы часов между ними.

Затем из этой таблицы вы можете выбрать только те строки, где разность часов больше или равнаравно 12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...