这将为满足条件的每一对
我有一个表格,格式如下:
<表类>
id
经度
lat
tbody><<tr>1 10.111 20.415 210.099 30.132 3 10.110 20.414 表类>
不需要临时表
你可以做自连接:
SELECT t1.id, t2.id
FROM tablename t1 INNER JOIN tablename t2
ON t2.id <> t1.id AND ABS(t1.lon - t2.lon) < :tol AND ABS(t1.lat - t2.lat) < :tol;
这将为满足条件的每一对
id
返回一行。如果您想为每个id
提供一个逗号分隔的所有满足条件的id
的列表,那么您可以聚合并使用STRING_AGG()
:
SELECT t1.id, STRING_AGG(t2.id, ';' ORDER BY t2.id)
FROM tablename t1 INNER JOIN tablename t2
ON t2.id <> t1.id AND ABS(t1.lon - t2.lon) < :tol AND ABS(t1.lat - t2.lat) < :tol
GROUP BY t1.id;
所有使得
lon
和lat
小于容差值的id
一个简单的自连接,如forpas所示,可以解决这个任务。
然而时,简单查询必须计算两行的每个组合的的增量,然后消除给定容差之外的对。基本上是笛卡尔积,与O(N²)的比例非常大。如果您的表不是特别小,请继续阅读。
目标是得到O(N)代替。我们将使用一些高级概念:- 最近邻搜索
- GiST表达指数
LATERAL
join 递归CTE中
最近邻查询
如果你不熟悉,这里有一个介绍最近邻搜索与PostGis(可能在使用您的地理编码?)。
无论哪种方式,我们都可以在Postgres中对point
类型执行相同的操作。需要一个GiST索引,同时坚持原来的原始表,基于表达式:
CREATE INDEX tbl_point_gist_idx ON tbl USING GiST (point(lon, lat));
基本查询-快速但不完善
SELECT t.*, t1.id AS near_id, t1.lon AS near_lon, t1.lat AS near_lat
FROM tbl t
JOIN LATERAL (
SELECT *
FROM tbl t1
WHERE t1.id <> t.id
ORDER BY point(t.lon, t.lat) <-> point(t1.lon, t1.lat)
LIMIT 5 -- arbitrary
) t1 ON abs(t.lon - t1.lon) < 0.0011
AND abs(t.lat - t1.lat) < 0.0011;
near_lat3 10.110 20.414
相关内容
- PySpark 数据帧:查找最接近整数列值的数组列索引
- 查找与pandas df中的参考值最接近的上下值
- javascript中的一个函数,用于查找数组中最接近某个阈值(最接近左边)的数字
- 在pyspark中查找最接近值列表的值
- 查找值最接近的行
- 查找更小但最接近当前值的值
- 如何使用Python查找行中最接近的日期?
- Javascript 在对象数组中查找最接近的数字并检索对象的键值
- Jquery:只查找最接近的匹配元素
- 在sql中查找最接近的值
- SQL -查找日期最接近但列值不同的行
- 查找最小日期(最接近当前日期),如果日期位于未来日期和最大日期(最接近当前日期),如果日期位于sql中的过去日期?<
- 查找与流API属性最接近的值
- 为列表中的每个元组查找最接近的元组的算法
- 查找排序后的pandas数据框中与列表中值最接近的值
- 在包含多个结果的数组中查找匹配或最接近的值
- 查找元素与给定数最接近的值或最接近的和值的函数
- 查找每个customerId最接近的日期并计算时间跨度
- 最接近查找DIV元素的jQuery
- 使用最接近查找文本输入的JQuery问题
最新更新
- 使用Knex检查现有id
- 用于Spring MVC的Spring启动驱动器,在另一个端口上没有Spring启动
- 在 GCP 云构建中,GitLab CI/CD 的环境文件是否有等效项?
- 为什么我们需要等待?
- 当我运行我的KB主程序时,我得到编译错误:包javax.xml.bind.annotation不存在
- Java:从软链接路径获取执行jar路径
- 用多个字符串变量填充JSON
- 将DIV元素中的所有单词转换为SPAN元素的id
- 如何在gitlab中配置端口转发?
- 制表器自动完成更新另一个单元格
- 如何限制EF Core命令文本记录通过Serilog
- React -我如何添加新的值到一个数组,并在警报窗口显示这个数组?
- 无法加载文件或程序集"系统
- 如何在Spring Boot上初始化Jackson以开始快速的第一次请求
- 我得到这个错误:ValueError:必须通过2-d输入. < font =宋体>
- 如何在Rails控制台中基于列格式过滤模型
- Swift包更新到MacOS Monterey后的问题
- 我的按钮上的边距不起作用,它们只是在右上角堆叠在一起
- Document.write( "*" );for 循环在我的"*"金字塔的末尾返回一个未定义的值?
- 输出多个.csv文件,在.csv文件名后面加上powershell作为源文件夹名
- 如何使用jQuery或JavaScript使A中的表单输入值出现在B中
- React原生蓝牙键盘支持
- 当向Keycloak操作符用户添加组时,我得到一个用户未找到错误
- 在使用TestServer进行集成测试时,在Visual Studio测试运行器中获得控制台登录 &
- 查找ANSYS Mechanical APDL仿真的裂纹尖端位置或裂纹路径坐标
- OnClick导致活动关闭
- 无法启动剧作家铬
- firebase实时数据库更新内部函数无法看到参数React Native
- 为什么这里使用另一个线程来刷新数据?
- Wso2 saml断言撤销并创建新的
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium