Sql语句实现不同记录同一属性列的差值计算
2018-03-28 16:57
1201 查看
所使用的表的具体结构如下图所示
Table中主键是(plateNumber+currentTime)要实现的查询是:给定车牌号和查询的时间区间,查询给定的时间区间内所包含记录的currentTime的差值,并计算AverageSpeed和该差值的乘积,求这段时间内的最高速度(HighestSpeed),并按照type值得不同进行划分。-->(type值只有0和1两个值)
主要思路是,首先能够得出的是相同type类型下同一个车牌号(也即同一车辆)在给定的时间区间内的currentTime的差值,比如按照currentTime排序号,相邻两条记录currentTime的差值,得出这个以后,其余的都可以通过聚合函数得出。
我们以车牌号为京A111111为例,设计如下图所示的测试用例。
可以看到车牌号为京A111111的车辆总共有6条记录,其中type为0的有两条,type为1的有4条,
我们首先计算时间的差值,sql语句书写如下:
SELECT
a.plateNumber,a.currentTime,a.type,a.AverageSpeed,a.HighestSpeed,
currentTime-(SELECT currentTime FROM carmultispeedinfo WHERE plateNumber = a.plateNumber AND type = a.type AND currentTime<a.currentTime ORDER BY currentTime DESC LIMIT 1)AS timediff
FROM
carmultispeedinfo a
通过navicat可以看到如下图所示的查询结果:
通过核查timediff的值是正确的,这样之后就可以在这个基础上添加内容了。
完整的sql语句如下:
SELECT
SUM(aa.AverageSpeed*aa.timediff) AS milesdiff,MAX(aa.HighestSpeed) AS HighestSpeed,SUM(aa.timediff) AS timediff,aa.type
FROM
(SELECT a.plateNumber,a.currentTime,a.type,a.AverageSpeed,a.HighestSpeed,
currentTime-(SELECT currentTime FROM carmultispeedinfo WHERE plateNumber = a.plateNumber AND type = a.type AND currentTime<a.currentTime ORDER BY currentTime DESC LIMIT 1)
AS timediff
FROM
carmultispeedinfo a)aa
WHERE
aa.plateNumber = '京A111111'
AND
aa.currentTime>=1521790124670
AND
aa.currentTime<=1521790125685
GROUP BY
aa.type
显示结果如下:
经过核对,是我们想要得出的结果。之后将sql对应替换到mybatis的mapper文件中就可以了。<记录一下,备忘>将来有更深入的理解之后会继续更新,谢谢大家。
Table中主键是(plateNumber+currentTime)要实现的查询是:给定车牌号和查询的时间区间,查询给定的时间区间内所包含记录的currentTime的差值,并计算AverageSpeed和该差值的乘积,求这段时间内的最高速度(HighestSpeed),并按照type值得不同进行划分。-->(type值只有0和1两个值)
主要思路是,首先能够得出的是相同type类型下同一个车牌号(也即同一车辆)在给定的时间区间内的currentTime的差值,比如按照currentTime排序号,相邻两条记录currentTime的差值,得出这个以后,其余的都可以通过聚合函数得出。
我们以车牌号为京A111111为例,设计如下图所示的测试用例。
可以看到车牌号为京A111111的车辆总共有6条记录,其中type为0的有两条,type为1的有4条,
我们首先计算时间的差值,sql语句书写如下:
SELECT
a.plateNumber,a.currentTime,a.type,a.AverageSpeed,a.HighestSpeed,
currentTime-(SELECT currentTime FROM carmultispeedinfo WHERE plateNumber = a.plateNumber AND type = a.type AND currentTime<a.currentTime ORDER BY currentTime DESC LIMIT 1)AS timediff
FROM
carmultispeedinfo a
通过navicat可以看到如下图所示的查询结果:
通过核查timediff的值是正确的,这样之后就可以在这个基础上添加内容了。
完整的sql语句如下:
SELECT
SUM(aa.AverageSpeed*aa.timediff) AS milesdiff,MAX(aa.HighestSpeed) AS HighestSpeed,SUM(aa.timediff) AS timediff,aa.type
FROM
(SELECT a.plateNumber,a.currentTime,a.type,a.AverageSpeed,a.HighestSpeed,
currentTime-(SELECT currentTime FROM carmultispeedinfo WHERE plateNumber = a.plateNumber AND type = a.type AND currentTime<a.currentTime ORDER BY currentTime DESC LIMIT 1)
AS timediff
FROM
carmultispeedinfo a)aa
WHERE
aa.plateNumber = '京A111111'
AND
aa.currentTime>=1521790124670
AND
aa.currentTime<=1521790125685
GROUP BY
aa.type
显示结果如下:
经过核对,是我们想要得出的结果。之后将sql对应替换到mybatis的mapper文件中就可以了。<记录一下,备忘>将来有更深入的理解之后会继续更新,谢谢大家。
相关文章推荐
- 在不同SQL服务器上的数据库之间表记录的复制(sql语句实现)
- 执行一条sql语句update多条不同值的记录实现思路
- 用SQL语句来实现随机选定不同记录
- 在不同SQL服务器上的数据库之间表记录的复制(sql语句实现)
- 在不同SQL服务器上的数据库之间表记录的复制(sql语句实现)
- 一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
- 循环SQL语句实现,将一个数字字段的商数拆分成多条记录
- SQL语句实现删除重复记录并只保留一条
- 执行一条sql语句update多条记录实现思路
- Laravel框架实现利用监听器进行sql语句记录功能
- 让数据库中始终保持N条记录.sql语句实现
- 有两张表,结构相同,写一条sql语句,将表A里不同内容的记录复制到表B里
- sqlite sql语句实现记录存在则修改、不存在则添加
- Oracle数据库Timestamp数据差值计算Sql语句
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第五部分 Insert语句)
- 在SQL语句中查询多条记录并把多条记录同一字段的值连接成一个字符并返回的写法
- 用一条SQL语句实现向数据库中插入多条记录的方法
- SQL语句查询表中的第一条记录在不同数据库中的不同之处
- 用一条SQL语句实现向数据库中插入多条记录的方法
- SQL语句实现取消自增列属性