我有一张包含纬度和经度列的表格。在大多数情况下,该值延伸超过小数点:-81.7770051972473在极少数情况下值如下:-81.77对于某些记录。
如何找到重复项并删除其中一个重复项,仅用于超出两位小数的记录?
答案 0 :(得分:1)
不确定如何在SQL中完全执行此操作。
我使用PHP或CFML等脚本语言通过构建查询来拉取记录然后循环遍历记录集并执行一些比较来解决类似的需求。如果为true,则非常小心地调用另一个函数,传入记录ID并删除记录。我甚至可能将记录保留在表中,但将另一列标记为isDeleted。
如果你比我更有野心,看起来这个线程接近你想要的
答案 1 :(得分:1)
使用一些有创意的substring
,float
和charindex
逻辑,我想出了这个:
delete l1
from
latlong l1
inner join (
select
id,
substring(cast(latitude as varchar), 0, INSTR(CAST(latitude as varchar))+3, '.') as truncatedLat
from
latlong
) l2 on
l1.id <> l2.id
and l1.latitude = cast(l2.truncatedLat as float)
在开始使用之前,请先尝试select *
代替delete l1
以确保删除正确的行。
我应该注意到,这在SQL Server上使用我知道存在于MySQL中的函数,但我无法针对MySQL实例进行测试,因此可能需要进行一些调整。例如,在SQL Server中,我使用charindex
而不是instr
,但两者都应该相似。
答案 2 :(得分:1)
使用外部编程语言(Perl,PHP,Java,Assembly ...):
如果出于某种原因,您想要识别超过2位精度的所有内容:
select * from database where lat != round(lat,2), or long != round(long,2)