通过迭代增加边距来更新重复的纬度值

时间:2015-05-08 23:05:28

标签: sql oracle

我在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以某种方式实现这一目标吗?

1 个答案:

答案 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