我在Oracle数据库表中有lat和long列存储为常规数字。 其中一些是重复的。我想要一种方法来向任一列添加一个非常小的余量以消除重复。问题是,对于每个相同的对,重复记录的数量可能会有所不同。在这种情况下,我必须调整我为每对迭代添加的边距。
示例:
ID | LAT | LONG
==================
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
在这种情况下,我想在任一列中添加.0003的余量以消除重复,但我不能盲目地将.0003添加到ID 2和3,因为它们仍然是重复的,所以我必须为i in(0 ...重复行数)
做original_value +(margin * i)所以我想结束这样的事情:
ID | LAT | LONG
1 | 1 | 1
2 | 1.0003 | 1
3 | 1.0006 | 1
我如何在SQL中执行此操作?我可以用游标模仿命令式编程,但它似乎不是SQL方式。我可以通过INSERT INTO SELECT以某种方式实现这一目标吗?
答案 0 :(得分:1)
我不知道您的确切数据是什么样的,但假设您有此表,名为tbl
:
ID LAT LON
---------- ---------- ----------
1 20 25
2 30 33
3 30 33
4 55 60
5 55 60
6 55 60
您可以运行以下命令:
select id,
case when rn > 1 then lat+rn-1 else lat end as lat,
lon
from(
select t.*,
row_number() over(partition by lat, lon order by id) as rn
from tbl t
) x;
获得:
ID LAT LON
---------- ---------- ----------
1 20 25
2 30 33
3 31 33
4 55 60
5 56 60
6 57 60
注意ID 2和3是如何重复的,ID 4,5和6是重复的。它们不再是精确的重复,因为lat
值已按顺序增加,以使行不重复。每个下一个副本都会增加一个。
小提琴: http://sqlfiddle.com/#!4/ef959/1/0
修改(根据您的修改)
select id,
case when rn > .0003 then lat+rn-.0003 else lat end as lat,
lon
from(
select t.*,
row_number() over(partition by lat, lon order by id)*.0003 as rn
from tbl t
) x;
以上将上升0.0003而非1。
在此处查看新的小提琴:http://sqlfiddle.com/#!4/21506/6/0