Sql server 更新不同列中的重复数据

Sql server 更新不同列中的重复数据,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个关于轨道的地理数据表,基本上有很多点和纬度/长度坐标组成了一条轨道。现在,我的问题是一些轨迹“共享”点,我想在同一个表的另一个字段中引用这些共享点。让我举例说明: TrackName | PointNo | Lat | Long | SharedTrack | SharedPoint ------------------------------------------------------------ Track1 | 1 |-35.3| 100.4| null

我有一个关于轨道的地理数据表,基本上有很多点和纬度/长度坐标组成了一条轨道。现在,我的问题是一些轨迹“共享”点,我想在同一个表的另一个字段中引用这些共享点。让我举例说明:

TrackName | PointNo | Lat | Long | SharedTrack | SharedPoint
------------------------------------------------------------
Track1    | 1       |-35.3| 100.4| null        | null
Track1    | 2       |-35.2| 100.5| null        | null
Track1    | 3       |-35.1| 100.6| null        | null
Track2    | 1       |-34.9| 100.8| null        | null
Track2    | 2       |-35.0| 100.7| null        | null
Track2    | 3       |-35.1| 100.6| null        | null
有些记录可能具有相同的Lat和Long值,这就是我们所说的共享点。所以现在,我必须更新所有记录,以便SharedPoints从具有最低TrackName的曲目中获取Lat和Long值。。。按照相同的示例,这将是:

TrackName | PointNo | Lat | Long | SharedTrack | SharedPoint
------------------------------------------------------------
Track1    | 1       |-35.3| 100.4| null        | null
Track1    | 2       |-35.2| 100.5| null        | null
Track1    | 3       |-35.1| 100.6| null        | null
Track2    | 1       |-34.9| 100.8| null        | null
Track2    | 2       |-35.0| 100.7| null        | null
Track2    | 3       |-35.1| 100.6| Track1      | 3
感谢您的帮助。

尝试以下方法:

create table Track
(
    TrackName varchar(max)
    , PointNo int
    , Lat  decimal(9, 1)
    , Long decimal(9, 1)
    , SharedTrack   varchar(max) 
    , SharedPoint int
)

insert Track 
values ('Track1' , 1 , -35.3, 100.4, null , null)
, ('Track1' , 2 , -35.2, 100.5, null , null)
, ('Track1' , 3 , -35.1, 100.6, null , null)
, ('Track2' , 1 , -34.9, 100.8, null , null)
, ('Track2' , 2 , -35.0, 100.7, null , null)
, ('Track2' , 3 , -35.1, 100.6, null , null)
, ('Track3' , 3 , -35.1, 100.6, null , null)
, ('Track4' , 1 , -35.1, 100.6, null , null)

;with cte
as
(
    -- Find all the shared tracks first.
    select a.Lat, b.Long, a.TrackName, b.TrackName as 'LowTrackName'
    from Track a
    join Track b    on a.Lat = b.Lat and a.Long = b.Long 
                        and a.TrackName > b.TrackName
)
, cte_2
as
(
    -- Get the lowest TrackName 
    select Lat, Long, TrackName, min(LowTrackName) as 'MinTrackName'
    from cte
    group by Lat, Long, TrackName
)
, cte_3
as
(
    -- Get the matching PointNo for the lowest TrackName
    select a.Lat, a.Long, a.TrackName, a.MinTrackName, b.PointNo
    from cte_2 a
    join Track b    on a.Lat = b.Lat
                        and a.Long = b.Long
                        and a.MinTrackName = b.TrackName
)
update a
set SharedTrack = b.MinTrackName
    , SharedPoint = b.PointNo
from Track a
join cte_3 b        on  a.Lat = b.Lat
                        and a.Long = b.Long
                        and a.TrackName = b.TrackName
where SharedTrack is null
and SharedPoint is null

请使用提供表架构和insert语句。这将帮助其他人更快地获得答案。当Track1与Track2共享时,为什么您只想用Track1信息更新Track2?您不应该同时更新两行吗?@LouieBao实际上最好将这些信息发布在此处,以便响应者可以在任何地方工作/测试,没有被强迫去任意的辅助站点。@AaronBertrand客户所说的是,名字最低的曲目较旧,所以较新的曲目在较旧曲目的“顶部”。。。DB实际上不是关于轨道的,但它是我能想到的最简单的描述方式。