我有一个每五秒钟更新一次的状态表。大多数数据将保持不变(lat / lng),因为车辆大部分时间都是静止的。
没有采取读取每条记录的路线,并将其与前一条记录进行比较....有没有办法跳过完全相同的记录(更新日期时间字段除外) ?
答案 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