【问题标题】:MySQL - Large table calculate vehicle average speedsMySQL - 大表计算车辆平均速度
【发布时间】:2021-06-20 15:53:58
【问题描述】:

我有一个大表,结构如下:

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

这是非常多的行,目前数据仅在日表中,每个表包含 1 天。然而,这可能会被合并以在多天内运行此查询。我对任何超过一定速度的车辆感兴趣,因此在此列上进行过滤会很棒。

提前感谢你们非常聪明的人。 :)

此数据位于 MariaDB (10.3)(数据库中,但可以导出到任何内容以帮助我实现此目的。 我不知道从哪里开始,并尝试在 Power BI 中运行它,其措施取得了部分成功,但内存不足,我花了几天时间尝试,现在几乎放弃了。

我在 MySQL 方面有点新手,虽然我可以使用基本命令,但我从未尝试过这样的事情,甚至不确定是否可能?任何帮助或指导表示赞赏。

【问题讨论】:

  • 忘记添加(如乌鸦飞行)Haversine(大圆)距离很好,不需要通过公路,这只是为了获得平均值,不必非常准确。
  • Edit 问题并展示您已经尝试过的内容。解释失败的原因/位置。具体(错误消息、意外结果等)。
  • select version(); 说什么?
  • 假设 10.2 或更高版本,您将为此使用 mariadb.com/kb/en/lag
  • 幸运的是,有一个编辑按钮

标签: mysql math geo


【解决方案1】:

你会做这样的事情:

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;

我可能弄错了距离公式,我没有得到与你相同的数字。

fiddle

【讨论】:

  • MySQL 从 5.7 开始就有 ST_Distance_Sphere
  • @Strawberry 但 AIUI mariadb 没有(但可能会在 10.6 中)
  • 这需要 30 分钟才能在我相当大的数据集上运行,但完全符合要求。谢谢,这行得通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2017-07-16
相关资源
最近更新 更多