Удалить старые дубликаты и сохранить последние дубликаты по метке времени - PullRequest
0 голосов
/ 26 сентября 2018

У меня следующий запрос:

;WITH Duplicates AS 
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY ChannelName, SerialNumber, ReadingDate ORDER BY ChannelName) AS Rownumber
        FROM [Staging].[UriData]        
    )       
    DELETE FROM Duplicates WHERE Rownumber > 1
    --AND ROWNUMBER >=< ???
    OPTION (MAXRECURSION 0)

Это прекрасно работает и находит дубликаты в таблице.Однако таблица часто обновляется с исправленными данными.

Ко времени выполнения запроса могло произойти три или более обновлений.

Это означает, что я хочу удалить все, кроме самой последнейзаписей.В таблице есть поле метки времени, которое обозначает, когда произошла последняя вставка.Я предполагаю, что я должен использовать это поле, чтобы определить, какая строка является последней, а любая, которая не является наибольшим номером строки, удаляет их.Это правильный подход?

TIA

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018
DELETE older
FROM Staging.UriData older
WHERE EXISTS(SELECT 1
   FROM Staging.UriData newer
   WHERE newer.ChannelName = older.older
      and newer.SerialNumber = older.SerialNumber
      and newer.ReadingDate = older.ReadingDate
      and newer.timestamp > older.timestamp
)
0 голосов
/ 26 сентября 2018

Конечно, вы можете использовать timestamp столбец с ROW_NUMBER(), и вам не нужно использовать рекурсию подсказку, так как ваш CTE не имеет никакого уровня рекурсии.

;WITH Duplicates AS  (
       SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY ChannelName, SerialNumber, ReadingDate ORDER BY timestamp DESC) AS Rownumber
       FROM [Staging].[UriData]        
 ) 

DELETE d
FROM Duplicates d
WHERE Rownumber > 1;
...