简述

博主最近因工作任务缠身,都无暇顾及到我的这片自留地了。前段时间稍有空闲,花了较多的精力学习《啊哈算法》,从中学习到很多之前没有太注重的内容,收益颇丰。但是这些算法题目还没有看完,等后面有时间了,还需重新自我温习一下前面所写的内容,并且继续耕耘后面的算法知识。

今天稍微有点时间,总结一下博主近期工作中所遇到的一些难题,希望借此机遇总结一下类似问题的解决方法,也算是一种积累吧。

背景

我们在司机的手机APP里预置了定时上报GPS数据的功能,功能设置为了APP每15秒收集一次GPS定位地址,然后每收集到10次就上报到服务器端持久化。但因为APP非安卓系统集成,而是由我方自主提供并设计了此功能,那么GPS数据的收集就有可能因司机人为操作或者其他网络等的影响,产生定位偏差或者获取定位失败的情况。现在我们服务端就有这么一个需求,要求分析出安装在司机手机中的APP是否定期收集到了GPS位置。

为了保证GPS定位数据能够较为顺利的上传到服务器端,我们在APP每次请求完服务器端之后,只有当APP接收到来自服务器的正确回应,才能表示这次上传数据是正常且准确的,然后清空掉APP端上一次记录的GPS定位数据;但是如果APP因为各种原因无法将上一次收集的数据上报的服务器端,再尝试一番之后无果,将会在下一次与下一批收集到的数据一同上报,通过此机制来保证数据传递的稳定性。

分析

如果司机手机中的APP是定时15秒就收集到GPS地址的话,那么持久化到数据库中按获取时间顺序排列的前后两条记录的时间差应该就是15秒了,如果大于了15秒,那么就说明定时获取出现了问题。那么现在我们要做的,就是筛选出前后两条记录在获取GPS位置的时间差是否大于15秒,计算时间差的方法在MySQL中已经有了,那就是TimeDiff(对于TimeDiff在Java中使用的小坑我前面的博文有所总结,有兴趣的朋友可以Mark一下,后面抽时间看看。),而对于计算前后两条记录怎么计算差值,这好像确实没有接触过,那么本篇文章就来解决这个问题。

https://www.cnblogs.com/captainad/p/10855608.html

解决

首先博主在服务端有一个表来记录司机上报上来的GPS点位信息,表结构如下:

1 --司机GPS收集表

2 CREATE TABLEcaptainad_driver_gps_position (3 id BIGINT NOT NULL auto_increment COMMENT '主键',4 business_id BIGINT DEFAULT NULL COMMENT '业务ID',5 device_mac VARCHAR (64) DEFAULT NULL COMMENT '设备MAC地址',6 device_imei VARCHAR (64) DEFAULT NULL COMMENT '设备IMEI',7 lat_lng VARCHAR (64) DEFAULT NULL COMMENT '纬经度',8 capture_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '捕获时间',9 create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',10 update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',11 PRIMARY KEY(id),12 KEY`idx_business_id` (`business_id`) USING BTREE13 ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '司机GPS收集';

表中记录的数据大致如下:

现在就对按获取GPS位置的时间capture_time在按照时间排序之后,进行前后两条记录计算差值。为了计算两者的差值,那么我们肯定是需要获取到一前一后两条记录的,这里我们可以巧用一个变量来记录当前行的行数,然后随着循环查询每次将行数叠加,以达到行记录的目的,这样一来,我们就能知道哪两条记录是一前一后的了。

打印行号的SQL语句:

1 SELECT

2 (@rownum := @rownum + 1) ASrownum,3 tab.business_id,4 tab.device_mac,5 tab.capture_time6 FROM

7 captainad_driver_gps_position tab,8 (SELECT @rownum := 0) r --声明变量

9 WHERE

10 1 = 1

11 ANDDATE_FORMAT(12 tab.capture_time,13 '%Y-%m-%d'

14 ) = '2019-06-28'

15 ORDER BY

16 tab.capture_time

基于此,我们将目标SQL给写出来,这里我根据我们的实际业务将语句稍微做了整理,脚本大致如下:

1 SELECT

2 t.business_id,3 t.device_mac,4 t.capture_time,5 t.tdiff6 FROM

7 (8 SELECT

9 r1.business_id,10 r1.device_mac,11 r1.capture_time,12 TIMEDIFF(13 r2.capture_time,14 r1.capture_time15 ) AS 'tdiff'

16 FROM

17 (18 SELECT

19 (@rownum := @rownum + 1) ASrownum,20 tab.business_id,21 tab.device_mac,22 tab.capture_time23 FROM

24 captainad_driver_gps_position tab,25 (SELECT @rownum := 0) r26 WHERE

27 1 = 1

28 ANDDATE_FORMAT(29 tab.capture_time,30 '%Y-%m-%d'

31 ) = '2019-06-28'

32 ORDER BY

33 tab.capture_time34 ) r135 LEFT JOIN(36 SELECT

37 (@INDEX := @INDEX + 1) ASrownum,38 tab.business_id,39 tab.device_mac,40 tab.capture_time41 FROM

42 captainad_driver_gps_position tab,43 (SELECT @INDEX := 0) r44 WHERE

45 1 = 1

46 ANDDATE_FORMAT(47 tab.capture_time,48 '%Y-%m-%d'

49 ) = '2019-06-28'

50 ORDER BY

51 tab.capture_time52 ) r2 ON r1.business_id =r2.business_id53 AND r1.device_mac =r2.device_mac54 AND r1.rownum = r2.rownum - 1

55 ) t56 WHERE

57 t.tdiff > '00:00:15'

在上面的代码中,我们通过 r1.rownum = r2.rownum - 1来判断两条记录是否是前后行,然后再使用TIMEDIFF函数来计算时间差,到此,我们的目标就实现了。

mysql+两行+一样+筛选_MySQL计算相邻两行某列差值的方法相关推荐

  1. mysql 取差值_MySQL计算相邻两行某列差值的方法

    简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...

  2. mysql计算相邻的差值_MySQL如何计算相邻两行某列差值

    MySQL计算相邻两行某列差值的方法:首先通过[r1.rownum = r2.rownum - 1]来判断两条记录是否是前后行:然后再使用TIMEDIFF函数来计算时间差即可. [相关学习推荐:mys ...

  3. 编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值

    编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值 目录 题目描述 代码实现 题目描述 序列重排:给一个长度为n的序列A,求找出 ...

  4. 两个相邻时间之间的差值计算

    函数TimeStampDiff()是MySQL本身提供的可以计算两个时间间隔的函数, 语法为:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),其中u ...

  5. 【MySQL】# mysql计算两个时间的差值

    TIMESTAMPDIFF(format, start_date, end_date) format:以何种方式(天,小时,分钟,秒-)计算时间的差值 start_date:开始时间 end_date ...

  6. 【Python实用基础整合(二)】DataFrame是否为空判断及行/列差值、变化率计算

    一.DataFrame是否为空 判断整个DataFrame是否为空的方法: pandas.DataFrame.empty 示例: df = pd.DataFrame({'fruits':['apple ...

  7. Excel 计算重复项中的唯一值的方法

    计算重复项中的唯一值 假设你想要了解包含重复值的范围中有多少个唯一值. 例如,如果列包含: 值 5.6.7 和 6,结果为三个唯一值 - 5.6 和 7. 值"Bradley".& ...

  8. mysql 计算 两个字段 之差_MYSQL计算两个字段日期差

    一,TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2). 说明: 返回日期或日期时间表达式datetime_ ...

  9. mysql 连续日期统计_MYSQL -- 计算连续日期天数

    一.题目 -- 查询产品出现连续订单情况 二.数据 -- 自建表名:test,字段名:goodid(产品id),date(日期) 三.解题思路 1.观察发现,产品a有连续4天,产品b有一个3天,一个4 ...

最新文章

  1. SQL Server技术问题之视图优缺点
  2. 抄表 软件_云抄表小区智能电表远程抄表软件
  3. 【转】ABAP的坑3
  4. HDU1407 测试你是否和LTC水平一样高 暴力、二分、hash
  5. Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)
  6. simulink接收串口数据_JLink RTT连接Simulink
  7. nginx从0到1之参数配置
  8. CentOS7配置默认网关
  9. FreeMarker合并单元格
  10. 扫地机器人半湿拖布_告别干湿不均,懂湿拖的自动扫地机器人最在行
  11. 令人眼前一亮的下拉式终端 Tilda Guake
  12. 【优化预测】基于matlab布谷鸟搜索算法优化SVM预测【含Matlab源码 1525期】
  13. 系列4—BabeLua常见问题
  14. python中撤销的快捷键_python常用快捷键
  15. Xmind8 绿色版安装教程
  16. vulnhub DriftingBlues: 6
  17. Unity不规则按钮
  18. iOS app跳转微信小程序失败 报bad_param
  19. Grafana可视化工具-之数字映射字符串
  20. HTML(二)在网页中插入表格

热门文章

  1. 给Sublime Text2安装GraphQL语法高亮插件
  2. Multiple Origin composition test - Opportunity Creation case
  3. 批量导出某个简书用户的所有文章列表和文章超链接
  4. SAP Marketing Cloud的技术架构
  5. SAP UI5的source code map(源代码映射)机制
  6. 小技巧:不用任何媒体处理软件进行视频压缩
  7. 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库 1
  8. 服务器无线不能登录界面,Web认证无法跳转到登录页面
  9. matlab 工业相机 曝光时间_CCD高清工业相机的主要参数及应用
  10. 2021广西对口中职高考成绩查询,教育资讯:2021广西本科对口中职分数线公布时间 几号查分...