基于经纬度的1公里范围内客户数据检索问题(Redash环境)
以指定用户经纬度为中心查询1公里范围内的客户数据
首先检查数据表中lat字段的数值格式——示例里的25,000应该是小数点.而非逗号,, 格式错误会导致距离计算失效,请先修正数据格式。
以下是针对不同数据库的SQL查询方案,替换your_table_name为你的实际表名:
PostgreSQL(带PostGIS扩展)
PostGIS提供原生地理空间函数,计算效率更高:
WITH center_point AS ( SELECT ST_SetSRID(ST_MakePoint(long, lat), 4326) AS center_geom FROM your_table_name WHERE user_id = 1 ) SELECT t.user_id, t.long, t.lat FROM your_table_name t, center_point cp -- ST_DistanceSphere返回单位为米,1000米=1公里 WHERE ST_DistanceSphere(t.long, t.lat, ST_X(cp.center_geom), ST_Y(cp.center_geom)) <= 1000;
MySQL/MariaDB
使用Haversine公式计算球面距离:
-- 先获取user_id=1的经纬度作为中心点 SET @center_long = (SELECT `long` FROM your_table_name WHERE user_id = 1); SET @center_lat = (SELECT lat FROM your_table_name WHERE user_id = 1); -- 筛选1公里内的用户,同时返回距离值 SELECT user_id, `long`, lat, -- 6371为地球平均半径(公里),计算结果单位为公里 6371 * 2 * ASIN(SQRT( POWER(SIN((@center_lat - lat) * PI()/180 / 2), 2) + COS(@center_lat * PI()/180) * COS(lat * PI()/180) * POWER(SIN((@center_long - `long`) * PI()/180 / 2), 2) )) AS distance_km FROM your_table_name WHERE distance_km <= 1 ORDER BY distance_km;
说明
- 若使用其他数据库(如BigQuery),核心逻辑一致:先获取中心点经纬度,再通过地理函数或公式计算距离并筛选。
- 注意
long是SQL关键字,在MySQL中需要用反引号`包裹避免语法错误。
内容的提问来源于stack exchange,提问作者Nanosa
相关产品推荐
相关产品推荐

