MySQL - 大 table 计算车辆平均速度
MySQL - Large table calculate vehicle average speeds
我有一个大的 table,结构如下:
dt
veh_id
lat
long
2021-01-14 13:00:00
123456ABC
26.56602763823091
2.937412284992731
2021-01-14 13:00:00
1762GH
26.56602763823091
2.937412284992731
2021-01-14 13:00:00
189725FT
26.56602763823091
2.937412284992731
2021-01-14 13:52:07
123456ABC
27.03312220493411
2.6008171450629343
2021-01-14 14:02:27
123456ABC
27.195391148992073
2.490953866466876
我想计算的(如果可能的话)是基于同一车辆 ID 行驶的额外行数。
dt
veh_id
lat
long
Time
Distance (Miles)
Speed (MPH)
2021-01-14 13:00:00
123456ABC
26.56602763823091
2.937412284992731
0
0
0
2021-01-14 13:00:00
1762GH
26.56602763823091
2.937412284992731
2021-01-14 13:00:00
189725FT
26.56602763823091
2.937412284992731
2021-01-14 13:52:07
123456ABC
27.03312220493411
2.6008171450629343
00:52:07
39.5
45.4
2021-01-14 14:02:27
123456ABC
27.195391148992073
2.490953866466876
00:06:20
13.2
76.6
这是非常多的行,目前数据只有 table 天,每个 table 包含 1 天。然而,这可能会在多天后合并到 运行 此查询。我对任何超过特定速度的车辆感兴趣,因此在此列上进行过滤会很棒。
提前感谢你们这些非常聪明的人。 :)
此数据在 MariaDB (10.3)(数据库中,但可以导出到任何东西以帮助我实现此目的。
我不知道从哪里开始,并尝试在 Power BI 中 运行 使用取得了部分成功但 运行 内存不足的措施并花了几天时间尝试我现在几乎已经给出了在这上面。
我在 MySQL 方面有点新手,虽然我可以使用基本命令,但我从未尝试过这样的事情,甚至不确定是否可行?感谢任何帮助或指导。
你会做这样的事情:
select dt, veh_id, lat, lon, sec_to_time(secs) time, round(distance,1) distance, round(if(secs,distance/secs*3600,0),1) speed
from (
select dt, veh_id, lat, lon,
timediff(dt,coalesce(lag(dt) over w,dt)) secs,
coalesce(
(3958.7613*(2*ASIN(SQRT(POWER(SIN(((lat-lag(lat) over w)*0.017453293)/2),2)+COS(lat*0.017453293)*COS((lag(lat) over w)*0.017453293)*POWER(SIN(((lon-lag(lon) over w)*0.017453293)/2),2)))))
,0) distance
from a_large_table
window w as (partition by veh_id order by dt)
) add_lag;
我可能把距离公式弄错了,我没有得到和你一样的数字。
我有一个大的 table,结构如下:
dt | veh_id | lat | long |
---|---|---|---|
2021-01-14 13:00:00 | 123456ABC | 26.56602763823091 | 2.937412284992731 |
2021-01-14 13:00:00 | 1762GH | 26.56602763823091 | 2.937412284992731 |
2021-01-14 13:00:00 | 189725FT | 26.56602763823091 | 2.937412284992731 |
2021-01-14 13:52:07 | 123456ABC | 27.03312220493411 | 2.6008171450629343 |
2021-01-14 14:02:27 | 123456ABC | 27.195391148992073 | 2.490953866466876 |
我想计算的(如果可能的话)是基于同一车辆 ID 行驶的额外行数。
dt | veh_id | lat | long | Time | Distance (Miles) | Speed (MPH) |
---|---|---|---|---|---|---|
2021-01-14 13:00:00 | 123456ABC | 26.56602763823091 | 2.937412284992731 | 0 | 0 | 0 |
2021-01-14 13:00:00 | 1762GH | 26.56602763823091 | 2.937412284992731 | |||
2021-01-14 13:00:00 | 189725FT | 26.56602763823091 | 2.937412284992731 | |||
2021-01-14 13:52:07 | 123456ABC | 27.03312220493411 | 2.6008171450629343 | 00:52:07 | 39.5 | 45.4 |
2021-01-14 14:02:27 | 123456ABC | 27.195391148992073 | 2.490953866466876 | 00:06:20 | 13.2 | 76.6 |
这是非常多的行,目前数据只有 table 天,每个 table 包含 1 天。然而,这可能会在多天后合并到 运行 此查询。我对任何超过特定速度的车辆感兴趣,因此在此列上进行过滤会很棒。
提前感谢你们这些非常聪明的人。 :)
此数据在 MariaDB (10.3)(数据库中,但可以导出到任何东西以帮助我实现此目的。 我不知道从哪里开始,并尝试在 Power BI 中 运行 使用取得了部分成功但 运行 内存不足的措施并花了几天时间尝试我现在几乎已经给出了在这上面。
我在 MySQL 方面有点新手,虽然我可以使用基本命令,但我从未尝试过这样的事情,甚至不确定是否可行?感谢任何帮助或指导。
你会做这样的事情:
select dt, veh_id, lat, lon, sec_to_time(secs) time, round(distance,1) distance, round(if(secs,distance/secs*3600,0),1) speed
from (
select dt, veh_id, lat, lon,
timediff(dt,coalesce(lag(dt) over w,dt)) secs,
coalesce(
(3958.7613*(2*ASIN(SQRT(POWER(SIN(((lat-lag(lat) over w)*0.017453293)/2),2)+COS(lat*0.017453293)*COS((lag(lat) over w)*0.017453293)*POWER(SIN(((lon-lag(lon) over w)*0.017453293)/2),2)))))
,0) distance
from a_large_table
window w as (partition by veh_id order by dt)
) add_lag;
我可能把距离公式弄错了,我没有得到和你一样的数字。