你的位置:首页 > 数据库

[数据库]用存储过程判断某个人员在一天的行进轨迹中是否有超过指定时间的停留


1.问题描述

在某项目中,巡更人员的手持GPS会每隔固定时间将此时人员所在位置上报至总数据库中。现在,我们需要知道指定人员在规定的时间内,是否有在某个点处停留超过20分钟的行为。

2.分析

首先,停留并不能理解为两点完全重合为停留。GPS坐标本身会有偏移和误差;并且在某个范围内无意义的移动也不能理解为有效的移动。

其次,代码上应该尽量提高通用度,将距离容差范围、时间容差范围、查询人员、查询时间段均应该设置为可控参数。

最后,作为统计需求,在无法进行每次上报位置时就进行实时判断的情况下,写成存储过程效率会比较高些。

3.具体实现

     

    

                          

4.优化

以上方案,是属于后发型统计行为,试想如果我要统计一周的情况,一个人员一周能上报几十万个轨迹点,在最坏的情况下,统计一个人员的循环遍历次数就要超过几十万次。

如果选择优化,优化的方向可以是将压力分散到每次上报时就进行判断。

我们以需要统计一周的停留超过预定时间人员来假设,具体思路如下:

A.建立一张每周定时情况的表,表名叫做tchumanweekstaycheck。此表可以包含两个字段:humanID和checked。用来记录这一周内哪些人员是的轨迹是不符合需求的。建立时,将所有人员编号均录入到此表,并且所有checked字段均是true。

B.上报轨迹点时,首先去tchumanweekstaycheck表中寻找该humanID对应的checked是否为false。

如果是,表示该人员已经有不符合规定的停留出现了,然后将该人员手持设备中的判断停留参数设置为false,下次上报案卷时不再进行停留判断,提高效率(判断已无意义)。

如果否,表示该人员一直合乎要求,然后将此坐标与之前的该人员坐标进行判断,如果有停留,记录停留时间。如果没停留,不记录停留时间。整个逻辑,和上面存储过程描述的逻辑相似。

C.当某个人员上报位置时,进行了停留判断,并且判断出此点出现了超过预设时间的停留,则将tchumanweekstaycheck表中对应的humanID的checked值变为false。

D.查看tchumanweekstaycheck即可知道哪些人员出现了超出停留时间。