样本表如下。列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代码?你能救我吗?
答案 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