MySql实现类似于【按顺序分组】的功能

简化后的table大概是这样的

t_located
ID TIME AREAID
1  00:00  e048
2  00:01  e048
3  00:02  e048
4  00:03  e048
5  00:04  f032
6  00:05  f032
7  00:06  e048

业务场景:定位器每隔特定时间获取所在区域内的人员信息,如果获取到就添加到数据库,这样可以看出,有人在e048待了3分钟,之后去了f032待了2分钟,之后回到e048

如果人的位置没动,定位器会一直向数据库添加记录,但最终只要刚到该点的第一条记录

希望的查询结果:

ID TIME AREAID
1  00:00  e048
5  00:04  f032
7  00:06  e048

由于人可能从e048去到别处再回来,导致期望结果出现若干个e048所以没法按AREA ID进行分组

无语了,困扰很久这个问题,希望能够有大神帮助写出sql语句,前提是不修改原数据库的数据添加方式

如果sql语句真的无法满足需求,希望能够得到数据库层面的其他解决方案,我看到mysql有自定义函数什么的,但是我不懂,希望大神能够解决,谢谢!

drop temporary table if exists tmp_located;
set @lag:='',@currs:='',@flag:=0;

create temporary table tmp_located
select ID,TIME,AREAID, @lag:=@currs as LAG_AREAID
, (@currs:=AREAID) as CUR_AREAID
, @flag:=if(@currs<>@lag,@flag:=1,0) as FLAG
from t_located
ORDER BY ID;

select ID, TIME, AREAID
from tmp_located
where FLAG=1

我没有想到简单的sql方法。
不过可以新建一个表,用来存每次**新到地址的时间**,只要用当前输入地址和查到的最近一次地址比较,地址不一样的保存,很容易实现的。
保存的新表就是你需要的查询结果。

你 写一个触发器 离开A点,回到A点 只是修改时间 应该就行了

http://blog.csdn.net/yabingshi_tech/article/details/52179431
参考这个,不过它最后分组了下,取的是连续最多的,你不需要那个分组,就输出全部了。

想将sql进行按顺序排序:order by abs(字段名称) 然后按照相同的参数分组,就ok;

你看看数据库事件能添加吗,插入数据时触发。不改数据库的话不好弄

我有一个思路:
写一个存储过程,
1.先根据AREAID分组,
2.再根据AREAID查出每个分组的所有记录,遍历每个分组所有记录的ID,如果ID是连续的,取连续ID的最小值,放到临时表,如果ID不连续,直接放到临时表。
3.最后结果直接返回临时表记录
PS:可以在存储过程中直接建临时表(不会真实存在数据库中),存储过程执行完成就会自动删掉临时表。可以了解在存储过程中创建临时表语法。
总结:方法比较笨,但是逻辑上可行的,可尝试一下。

额!过来看看,虽然知道没分了不过这样可以么
insert t_located(id,time,areaid) vlaues(……) where areaid != max(select AREAID from t_located order by time)