我有一個SQL Server 2014表,其中包含數百萬個gps座標,每個座標都在特定時間。然而,註冊之間的時間間隔並不固定,從1秒到幾個小時不等。我只想每4分鐘進行一次測量,因此其他記錄必須刪除。根據與上一個記錄和下一個記錄的關係選擇刪除記錄
我試過了遍歷每條記錄的T-SQL中的一個WHILE循環,循環內部有一個帶雙CROSS APPLY的SELECT語句,如果它位於另外兩條不超過4分鐘的記錄中,它將只返回一條記錄分開。然而這個策略太慢了。
這可以通過基於集合的解決方案來完成嗎?或者有沒有辦法加快這個查詢? (下面的測試查詢只是打印,還沒有刪除)
SELECT * INTO #myTemp FROM gps ORDER BY TimePoint asc
declare @Id Uniqueidentifier
declare @d1 varchar(19)
declare @d2 varchar(19)
declare @d3 varchar(19)
While EXISTS (select * from #myTemp)
BEGIN
select top 1 @Id = ID FROM #myTemp order by TimePoint asc
SELECT
@d1 = convert(varchar(19), a.justbefore, 121),
@d2 = convert(varchar(19), b.tijdstip, 121),
@d3 = convert(varchar(19), c.justafter, 121)
FROM Gps B CROSS APPLY
(
SELECT top 1 TimePoint as justbefore
FROM Gps
WHERE (B.TimePoint > TimePoint) AND (B.Id = @Id)
ORDER by TimePoint desc
) A
CROSS APPLY (
SELECT top 1 TimePoint as justafter
FROM Gps
WHERE (Datediff(n,A.justbefore,TimePoint) between -4 AND 0)
AND (B.TimePoint < TimePoint)
ORDER by TimePoint asc
) C
print 'ID=' + Cast(@id as varchar(50))
+ '/d1=' + @d1 + '/d2=' + @d2 + '/d3=' + @d3
DELETE #myTemp where Id = @id
END
-
Sample data:
Id TimePoint Lat Lon
1 20170725 13:05:27 12,256 24,123
2 20170725 13:10:27 12,254 24,120
3 20170725 13:10:29 12,253 24,125
4 20170725 13:11:55 12,259 24,127
5 20170725 13:11:59 12,255 24,123
6 20170725 13:14:28 12,254 24,126
7 20170725 13:16:52 12,259 24,121
8 20170725 13:20:53 12,257 24,125
在這種情況下,記錄3,4,5應予刪除。 記錄7應保持爲7和8之間的差距超過4分鐘。
你能發佈一些示例數據和預期的結果? –
我同意樣本數據和預期的結果會使這更容易通過。但我會建議做一個搜索差距和島嶼有很多例子。訣竅是你會希望將記錄分成4分鐘的增量,並能夠識別每個組中的第一條記錄。 – Matt