【问题标题】:fetch rows based on another activity in mysql根据mysql中的另一个活动获取行
【发布时间】:2020-12-11 16:01:04
【问题描述】:

我有一个用户位置的 mysql 表。我有如下记录

id    user_id     latitude                 longitude
 1      1         28.62584611111111        77.10560666666667
 2      1         28.62584611111111        77.10560666666667
 3      1         28.62584611111111        77.10560666666667
 4      1         28.62584611111111        77.10560666666667
 5      1         28.627457222222223       77.11092111111111
 6      1         28.627457222222223       77.11092111111111
 7      1         28.62584611111111        77.10560666666667
 8      1         28.62584611111111        77.10560666666667

现在看到 id 1,2,3,4,7,8 具有相同的经纬度,而 id 5,6 具有不同的经纬度

如果我分组,我只会得到两个结果。但我的预期输出如下:-

 id    user_id     latitude                 longitude
 4      1         28.62584611111111        77.10560666666667
 6      1         28.627457222222223       77.11092111111111
 8      1         28.62584611111111        77.10560666666667

我已经尝试了下面的查询,但这给了我两个结果

SELECT * FROM `user_locations` WHERE `user_id` = 1 Group by latitude, longitude

如果相同的纬度和经度不断出现,我想找到它必须返回一个最新的行,然后如果纬度和经度发生变化,那么最新的行将会出现,如果在两者之间再次相同的纬度和经度来自以前的集合也应该回来。希望你能理解我的问题。谁能帮我解决这个问题。

【问题讨论】:

  • 顺便说一下,在地球上,小数点后八位表示大约 1 毫米的精度。
  • 位置每 10 秒进入数据库
  • 你遇到我的问题了吗?我想要实现什么?.. 在这个组中不起作用
  • @Strawberry 你有没有检查我的预期输出

标签: sql mariadb subquery gaps-and-islands


【解决方案1】:

这是一个孤岛问题。 Islands 表示具有相同用户、纬度和经度的相邻行,并且您想要每个岛的最后一条记录。

这里最简单的方法大概是使用lag()来识别经纬度的变化:

select *
from (
    select ul.*,
        lag(latitude) over(partition by user_id order by id) lag_latitude,
        lag(longitude) over(partition by user_id order by id) lag_longitude
    from user_locations ul
) ul
where latitude <> lag_latitude or longitude <> lag_longitude

这需要 MariaDB 12.2.2 或更高版本。在早期版本中,您可以模拟具有相关子查询的窗口函数。对于大量行,这可能效率低下:

select *
from user_locations ul
where latitude  <> (select ul1.latitude  from user_locations ul1 where ul1.user_id = ul.user_id and ul1.id < ul.id order by ul1.id desc limit 1)
   or longitude <> (select ul1.longitude from user_locations ul1 where ul1.user_id = ul.user_id and ul1.id < ul.id order by ul1.id desc limit 1)

【讨论】:

  • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 4 行的 '(partition by user_id order by id) lag_latitude, lag(longitude, 1, long' 附近使用正确的语法
  • @kunal:您需要 MariaDB 10.2.2 或更高版本。你运行的是哪个版本? select version()可以告诉你。
  • 10.1.47 @GMB 我无权更新版本我们可以为这个版本 10.1.47 提供另一个解决方案吗?
  • @kunal:我修复了 MariaDB 的第一个查询(您最初将问题标记为 MySQL,语法略有不同)。我还为早期版本添加了另一个解决方案。
  • @kunal: user_id = 1 and (latitude &lt;&gt; ... or longitude &lt;&gt; ...)
猜你喜欢
  • 2021-11-05
  • 2012-10-22
  • 2018-11-17
  • 2021-09-02
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多