我在postgres中的GPS表的模式具有四个字段,分别是用户ID(int),纬度(float8),经度(float8),记录时间(时间戳)。对于每个用户,我们每分钟获得2条记录。
需要查询以在相同的GPS纬度长值上花费超过15分钟的用户吗?
样本记录可能是
Userid, Latitiude, Longitude, recordedtime
============================================
'ID1',12.089475408,76.089890,2019-11-24 19:10:01
'ID1',12.089475408,76.089890,2019-11-24 19:10:31
'ID1',12.089475408,76.089890,2019-11-24 19:11:01
'ID1',12.089475408,76.089890,2019-11-24 19:10:31
'ID1',12.089475408,76.089890,2019-11-24 19:12:01
'ID1',12.089475408,76.089890,2019-11-24 19:10:31
....
..
任何人都可以提供所需的查询吗?
此CTE
可能就是您想要的。
CTE
您是否考虑过使用WITH j AS (
SELECT userid,longitude,latitude,
max(recordedtime)-min(recordedtime) AS timespent
FROM t
GROUP BY userid,longitude,latitude
) SELECT * FROM j
WHERE timespent > interval '15 minute';
userid | longitude | latitude | timespent
--------+-----------+-----------+-----------
ID1 | 80.205480 | 13.082240 | 00:20:00
(1 Zeile)
处理您的观点?您的用例看起来很简单,但是很快您可能会发现自己难以在已在PostGIS中解决的数据模型中执行地理空间操作。
如果您有兴趣,这是根据GPS坐标创建几何列的方法:
PostGIS
PostGIS
功能中的值4326代表参考系统WGS84。检查哪一个适合您的坐标。
这就是查询的样子:
ALTER TABLE t ADD COLUMN geom GEOMETRY;
UPDATE t SET geom = ST_SetSRID(ST_MakePoint(longitude, latitude),4326);
Note:如@JGH所述,此用例假定坐标为identical,以便计算花费的时间。您的坐标有六个小数位,这使您的精度为ST_SetSRID
。长话短说,如果坐标偏离几米,它将不起作用。请记住;)