做地理数据分析,求助大家关于一条比较复杂的 SQL 写法

2017-09-14 16:50:50 +08:00
 Jolly23

首先有一张表 POINTS

地理数据结构如下

| USERID | TIME | GPS |

| ------------- | ------------- |

| 用户 A | sometime | (x,y) |

| 用户 A | sometime | (x,y) |

| 用户 A | sometime | (x,y) |

| 用户 A | sometime | (x,y) |

| 用户 A | sometime | (x,y) |

| 用户 B | sometime | (x,y) |

| 用户 B | sometime | (x,y) |

| 用户 B | sometime | (x,y) |

| 用户 C | sometime | (x,y) |

| 用户 C | sometime | (x,y) |

| 用户 D | sometime | (x,y) |

| 用户 D | sometime | (x,y) |

最终想要的出的结果

| USERID | TIME_1 | TIME_2 | FARTHEST | USER_DATA_COUNT |

| ------------- | ------------- |------------- |------------- |------------- |

| 用户 D | 用户 D 最远的两个点点 1 的时间 | 用户 D 最远的两个点点 2 的时间 | 3900 | 2 |

| 用户 A | 用户 A 最远的两个点点 1 的时间 | 用户 A 最远的两个点点 2 的时间 | 3200 | 5 |

| 用户 C | 用户 C 最远的两个点点 1 的时间 | 用户 C 最远的两个点点 2 的时间 | 1900 | 2 |

| 用户 B | 用户 B 最远的两个点点 1 的时间 | 用户 B 最远的两个点点 2 的时间 | 1400 | 3 |

我想拿出每一个用户距离自己的最远距离

FARTHEST:假设 dist((x1,y1), (x2,y2)) 即可得出距离

USER_DATA_COUNT:当前用户的数据数量

最终根据 FARTHEST 个人迁徙最远距离由高到低排序

思路分解

全部用户 ID:SELECT USERID from POINTS group by USERID

个人数据量:SELECT USERID, count(*) from POINTS group by USERID

	-- 这个是错的,得不到想要的结果,所以来这里问大家
    SELECT
        POINTS1.USERID,
        POINTS1.TIME AS time_1,
        POINTS2.TIME AS time_2,
        dist(POINTS1.GPS, POINTS2.GPS)
    FROM
        POINTS POINTS1,
        POINTS POINTS2
    WHERE
        POINTS1.USERID = POINTS2.USERID
    ORDER BY
        dist(POINTS1.GPS, POINTS2.GPS) DESC

项目用到了 PostgreSQL 的 PostGIS 这个扩展,具有此地理距离计算能力

1766 次点击
所在节点    PostgreSQL
1 条回复
Jolly23
2017-09-14 20:39:14 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/390707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX