GROUP BY одна и та же запись, но разные TIMESTAMP / DATETIME

0

Я пытаюсь выполнить GROUP BY тем же записям, но отличается от timestamp или datetime. Разница времени составляет всего около 3 минут от первой записи.

пример:

Вот как выглядит таблица базы данных.

*-------------------------------------------*
|   id  |   name    |         time          |
|   1   |   Lei     | 2018-02-21 12:00:10   |
|   2   |   Lei     | 2018-02-21 12:01:11   |
|   3   |   Lei     | 2018-02-21 12:01:15   |
|   4   |   Lei     | 2018-02-21 12:01:16   |
|   5   |   Anna    | 2018-02-21 12:03:11   |
|   6   |   Anna    | 2018-02-21 12:03:13   |
|   7   |   Bell    | 2018-02-21 12:05:01   |
|   8   |   Lei     | 2018-02-21 12:10:00   |
*-------------------------------------------*

Я хочу получить запись Lei с 12:00 до 3 минут с ее первой timestamp или datetime.

поэтому выход будет таким.

*-------------------------------------------*
|   id  |   name    |         time          |
|   1   |   Lei     | 2018-02-21 12:00:10   |
|   5   |   Anna    | 2018-02-21 12:03:11   |
|   7   |   Bell    | 2018-02-21 12:05:01   |
|   8   |   Lei     | 2018-02-21 12:10:00   |
*-------------------------------------------*

Я с радостью буду признателен за вашу помощь, mysql или php.

  • 0
    Пример вывода не имеет смысла. Идентификатор Анны действительно должен быть 2? Не должно ли остаться 5? Я предполагаю, что идентификатор автоматически увеличивается, верно?
  • 0
    Извините, @MonkeyZeus. Я забыл об этой логике, я уже отредактировал ее. Спасибо за упоминание этого :)
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE Table1
    ('id' int, 'name' varchar(4), 'time' datetime)
;

INSERT INTO Table1
    ('id', 'name', 'time')
VALUES
    (1, 'Lei', '2018-02-21 12:00:10'),
    (2, 'Lei', '2018-02-21 12:01:11'),
    (3, 'Lei', '2018-02-21 12:01:15'),
    (4, 'Lei', '2018-02-21 12:01:16'),
    (5, 'Anna', '2018-02-21 12:03:11'),
    (6, 'Anna', '2018-02-21 12:03:13'),
    (7, 'Bell', '2018-02-21 12:05:01')
;

Запрос 1:

select id, name, min(time) as time
from Table1 
group by name
order by time

Результаты:

    | id | name |                 time |
    |----|------|----------------------|
    |  1 |  Lei | 2018-02-21T12:00:10Z |
    |  5 | Anna | 2018-02-21T12:03:11Z |
    |  7 | Bell | 2018-02-21T12:05:01Z |

ИЛИ если вы хотите группировать по интервалу 3 минуты, вы можете сделать это так

select id, name, min(time) as time
from Table1 
group by name, UNIX_TIMESTAMP(time) DIV 180
order by time
;
  • 0
    Вопрос ОП гласит, что I want to get Lei's entry from 12:00:10 up to 3 minutes from her first timestamp or datetime record. Таким образом, если в 12:10:10 для леев есть ID # 8, то в выходных данных должен быть указан лей в качестве четвертой записи. Ваш SQL покрывает это?
  • 0
    @MonkeyZeus я обновил свой ответ
Показать ещё 4 комментария
0

Похоже, вам нужно что-то вроде этого:

select *
from mytable t
where not exists (
  select *
  from mytable t1
  where t1.name =  t.name
    and t1.id   <> t.id
    and t1.time >= t.time - interval 3 minute
    and t1.time <  t.time
);

Демо: http://sqlfiddle.com/#!9/03cf16/1

Он будет выбирать строки только в том случае, если ни одна строка с тем же name существует в течение трех интервалов munutes.

0

С вашими примерными данными вам не нужно вообще учитывать метку времени:

select (@rn := @rn + 1) as id, name, min(time) as time
from t cross join
     (select @rn := 0) params
group by id, name;

Группировка вещей с трехминутными интервалами, начиная с первой записи в интервале, намного сложнее. Для этого требуются переменные или рекурсивные CTE.

  • 0
    Привет, спасибо, что ответили ... но не могли бы вы объяснить свой ответ? :)
  • 0
    Вау, спасибо за помощь. К сожалению, я уже нашел ответ. Жаль, что я тоже не могу голосовать, у меня все еще мало репутации, но это действительно помогает! Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню