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实际上不是关于轨道的,但它是我能想到的最简单的描述方式。