消除状态表中的“重复”行

时间:2015-11-09 13:15:48

标签: sql-server

我有一个每五秒钟更新一次的状态表。大多数数据将保持不变(lat / lng),因为车辆大部分时间都是静止的。

没有采取读取每条记录的路线,并将其与前一条记录进行比较....有没有办法跳过完全相同的记录(更新日期时间字段除外) ?

2 个答案:

答案 0 :(得分:2)

您可以使用CTE + ROW_NUMBER

WITH CTE AS
(
    SELECT ID, lat, lng, DateTimeColumn,
           RN = ROW_NUMBER() OVER (PARTITION BY lat, ln
                                   ORDER BY DateTimeColumn ASC)
    FROM dbo.TableName
)
SELECT ID, lat, ln, DateTimeColumn
FROM CTE
WHERE RN = 1

这仅返回具有相同lat, ln值的每组数据的第一行。

答案 1 :(得分:0)

我会在插入阶段解决这个问题,比较你要插入的最新记录,一次只有一行。

但是如果你不能这样做,一种方法可能是使用嵌套查询提取每个lat和long的最早记录。我不太喜欢这个,因为它非常低效,但可能会给一个比我聪明的人一个想法。 (此示例假设您正在跟踪车辆,并且每辆车都有代码)。

它将为您提供最长的日期/时间。如果车辆经过两次相同的地面,可能会出现问题,除非您使用子查询做了一些时髦的事情,比如让它最早出现在那个纬度/长的一天,或者在一小时内,什么的。

SELECT
    a.AnyOtherFieldsYouMightWantFromTheTrackerTable,
    a.VehicleID,
    a.Lat,
    a.Long,
    a.Date
FROM tblTracker as a
JOIN (
    SELECT
       VehicleID,
       Lat, -- you don't really need Lat or Long in here but 
       Long, -- they're useful for running your subquery on its own
       Min(DateTime) as MinDateTime
    FROM tblTracker
    GROUP BY VehicleID, Lat, Long -- so long as they're in here
    ) as b
ON a.VehicleID = b.VehicleID
AND a.DateTime = b.MinDateTime