GROUP BY相同记录但TIMESTAMP / DATETIME不同

时间:2018-02-21 02:05:35

标签: mysql

我正在尝试GROUP BY相同的记录,但timestampdatetime不同。 从第一次进入开始,时间差异仅为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   |
*-------------------------------------------*

我想让雷的入场时间从她的第一个timestampdatetime记录的12:00:10到3分钟。

所以输出就是这样。

*-------------------------------------------*
|   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。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

SQL Fiddle

MySQL 5.6架构设置

Array
(
    [radios1] => Array
        (
            [0] => on
        )

    [from] => Array
        (
            [0] => Bangalore
        )

)

查询1

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')
;

<强> Results

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

或者如果您想按时间间隔分组3分钟,您可以这样做

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

答案 2 :(得分: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的行时,才会选择行。