2015-11-09 3 views
0

У меня есть таблица состояния, которая обновляется раз в пять секунд. большая часть данных останется неизменной (lat/lng), так как автомобиль будет неподвижен большую часть времени.Устранение «дубликатов» строк в таблице состояния

без, прокладывая маршрут чтения каждой записи и сравнивая ее с предыдущей .... есть ли способ пропустить записи, которые являются точно такими же (за исключением поля даты и времени обновления)?

+0

Если все, кроме даты и времени, совпадают, тогда вы можете просто удалить все записи, которые находятся до определенного времени. Для всех других вещей требуется дополнительная информация о том, насколько подобны данные, когда они отличаются друг от друга, когда они схожи, ..... – Thomas

ответ

2

Вы можете использовать СТ + 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 значений.

0

Я бы занялся этим на этапе вставки, сравнив то, что вы собираетесь вставить с самой последней записью, только по одной строке за раз.

Но если вы не можете этого сделать, одним из подходов может быть извлечение только самой ранней записи для каждой латы и длинной, используя вложенный запрос. Мне это не очень нравится, потому что это ужасно неэффективно, но может дать кому-то умнее, чем мне идея. (В этом примере предполагается, что вы отслеживаете транспортные средства, и у каждого автомобиля есть код).

Это даст вам самую раннюю дату/время, которое был указан на этом знаке транспортного средства. Может быть проблемой, если автомобиль перейдет по одной и той же земле дважды, если только вы не делаете что-то напуганное с подзапросом, например, сделайте его «раньше всего на том или ином в один день» или через час или что-то в этом роде.

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 
+0

Основная проблема с проверкой дубликатов при вставке заключается в том, что вы можете захотеть вставить дубликаты в виде журнала активности , В принципе, существует большая разница между «ничего интересного не произошло в 12:05» и «ничего не случилось» в 12:05 ». –

+0

Правда. Но, находясь под угрозой отклонения от исходного вопроса, вы можете использовать оператор insert для обозначения другого поля, байтового поля «Movement» или чего-то еще. – GroovySu

Смежные вопросы