MySQL Km计算

时间:2017-11-04 13:38:23

标签: mysql

样本表如下。列Km显示汽车的km计数器值。这是一个不断增加的价值。我会在km列中每隔5分钟自动记录这些数据。

ID	TIMESTAMP	            KM
1	    3.11.2017 10:00	    3778733
2	    3.11.2017 10:05	    3778774
3	    3.11.2017 10:10	    3778816
4	    3.11.2017 10:15	    3778857
5	    3.11.2017 10:20	    3778897
6	    3.11.2017 10:25	    3778937
7	    3.11.2017 10:30	    3778976
8	    3.11.2017 10:35	    3779015
9	    3.11.2017 10:40	    3779054
10	  3.11.2017 10:45	    3779094
11	  3.11.2017 10:50	    3779138
12	  3.11.2017 10:55	    3779178
13	  3.11.2017 11:00	    3779217
14	  3.11.2017 11:05	    3779260
15	  3.11.2017 11:10	    3779302
16	  3.11.2017 11:15	    3779343
17	  3.11.2017 11:20	    3779384
18	  3.11.2017 11:25	    3779426
19	  3.11.2017 11:30	    3779468
20	  3.11.2017 11:35	    3779511
21	  3.11.2017 11:40	    3779558
22	  3.11.2017 11:45	    3779600
23	  3.11.2017 11:50	    3779641
24	  3.11.2017 11:55	    3779681
25	  3.11.2017 12:00	    3779723
26	  3.11.2017 12:05	    3779764
27	  3.11.2017 12:10	    3779807
28	  3.11.2017 12:15	    3779849
29	  3.11.2017 12:20	    3779890
30	  3.11.2017 12:25	    3779932
31	  3.11.2017 12:30	    3779981
32	  3.11.2017 12:35	    3780024
33	  3.11.2017 12:40	    3780066
34	  3.11.2017 12:45	    3780110
35	  3.11.2017 12:50	    3780152
36	  3.11.2017 12:55	    3780195
37	  3.11.2017 13:00	    3780200

我想计算每小时汽车行驶的距离(带有视图表)。

示例输出表;

....
.....
......
10:00 - 11:00 => 484
11:00 - 12:00 => 506
12:00 - 13:00 => 477
......
.....
....

如何编写sql代码?你能救我吗?

2 个答案:

答案 0 :(得分:0)

在分组之前使用联合创建0分钟行的虚拟记录。请注意,这只有在您没有跨越日界时才会起作用 - 如果您这样做,则编写一个程序来执行此操作。

drop table if exists t;

create table t
(ID int,    tv varchar(20), ts datetime  ,  dt date, hr int,         KM int);
insert into t (id,tv,km) values
(1    ,  '3.11.2017 10:00'    ,  3778733),
(2    ,  '3.11.2017 10:05'    ,  3778774),
(3    ,  '3.11.2017 10:10'    ,  3778816),
(4    ,  '3.11.2017 10:15'    ,  3778857),
(5    ,  '3.11.2017 10:20'    ,  3778897),
(6    ,  '3.11.2017 10:25'    ,  3778937),
(7    ,  '3.11.2017 10:30'    ,  3778976),
(8    ,  '3.11.2017 10:35'    ,  3779015),
(9    ,  '3.11.2017 10:40'    ,  3779054),
(10,      '3.11.2017 10:45'   ,  3779094),
(11,      '3.11.2017 10:50'   ,  3779138),
(12,      '3.11.2017 10:55'   ,  3779178),
(13 , '3.11.2017 11:00',        3779217),
(14 ,  '3.11.2017 11:05',       3779260),
(15 ,  '3.11.2017 11:10',       3779302),
(16 ,  '3.11.2017 11:15',       3779343),
(17 ,  '3.11.2017 11:20',       3779384),
(18 ,  '3.11.2017 11:25',       3779426),
(19 ,  '3.11.2017 11:30',       3779468),
(20 ,  '3.11.2017 11:35',       3779511),
(21 ,  '3.11.2017 11:40',       3779558),
(22 ,  '3.11.2017 11:45',       3779600),
(23 ,  '3.11.2017 11:50',       3779641),
(24 ,  '3.11.2017 11:55',       3779681),
(25 ,  '3.11.2017 12:00',       3779723),
(26 ,  '3.11.2017 12:05',       3779764),
(27 ,  '3.11.2017 12:10',       3779807),
(28 ,  '3.11.2017 12:15',       3779849),
(29  , '3.11.2017 12:20',       3779890),
(30 ,  '3.11.2017 12:25',       3779932),
(31 ,  '3.11.2017 12:30',       3779981),
(32 ,  '3.11.2017 12:35',       3780024),
(33 ,  '3.11.2017 12:40',       3780066),
(34 ,  '3.11.2017 12:45',       3780110),
(35 ,  '3.11.2017 12:50',       3780152),
(36 ,  '3.11.2017 12:55',       3780195),
(37 ,  '3.11.2017 13:00',    3780200);

select id,str_to_date(tv,'%d.%m.%Y %H:%i') from t;

update t 
    set ts = str_to_date(tv,'%d.%m.%Y %H:%i');
update t 
    set dt = date(ts), hr = hour(ts);

select dt,hr, min(km), max(km) ,max(km) - min(km)
from (select dt,hr,km from t
union all
select dt,hr - 1 ,km from t where minute(ts) = 0) s
group by dt,hr

答案 1 :(得分:0)

此查询假定您每5分钟读取一次读数,并且行为ID就像行号。可以调整查询以仅依赖于时间戳。

第一个内部查询为每12行分配相同的组号grp(即,时间戳10.00到10.55,11.00到11.55等等将具有相同的grp)。

第二个内部查询选择每第13个条目并给它与第12个条目相同的组号,以便第13个条目最终包含在两个连续的组中,即ID = 13(时间戳11:00)将在组0中1,ID = 25(时间戳12:00)将在第1组和第2组等中。

一旦我们进行了正确的分组,外部查询就是一个简单的选择,其中包含组编号,以及该组的开始和结束时间戳。我添加了一个having子句,以避免像一小时内单个读取的情况(即该小时的距离为0)

SELECT MIN(ts) AS start_ts, MAX(ts) AS end_ts, MAX(km) - MIN(km) distance
FROM
    (SELECT FLOOR(id / 12.001) AS grp, id, ts, km
    FROM tbl 
    UNION 
    SELECT FLOOR(id / 12) - 1 AS grp, id, ts, km
    FROM tbl
    WHERE MOD(id, 12) = 1) temp
GROUP BY grp
HAVING COUNT(*) > 1
ORDER BY grp;

SQL小提琴here