Я пытаюсь выполнить 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.
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
;
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 покрывает это?
Похоже, вам нужно что-то вроде этого:
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.
С вашими примерными данными вам не нужно вообще учитывать метку времени:
select (@rn := @rn + 1) as id, name, min(time) as time
from t cross join
(select @rn := 0) params
group by id, name;
Группировка вещей с трехминутными интервалами, начиная с первой записи в интервале, намного сложнее. Для этого требуются переменные или рекурсивные CTE.