Удаление дубликатов на основе последней редакции в SQL - PullRequest
2 голосов
/ 10 ноября 2011

У меня был немного головокружительный момент SQL, и мне было интересно, если кто-нибудь может помочь.Используя эти данные (например):

workId     rateRevision
1          1
1          2
1          3
2          1
3          1
3          2
4          1
4          2
4          3

... Я в основном хочу удалить все дубликаты, кроме последней ревизии (самое высокое значение rateRevision).Таким образом, я бы закончил с:

workId     rateRevision
1          3
2          1
3          2
4          3

Теоретически это звучит очень просто, но я не могу решить это в SQL.Вот мой текущий код:

SELECT * FROM rate r
WHERE r.rateRevision = 
(select r.rateRevision from rate r ORDER BY r.rateRevision DESC LIMIT 1);

... но он просто возвращает

workId     rateRevision
4          3

Конечно, в данный момент это только выбор значений, но я планировал по существу простоизменив его для оператора удаления.У кого-нибудь есть идеи, пожалуйста?

Большое спасибо!Matt

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Как насчет чего-то вроде:

delete from rate r where r.rateRevision < (select max(r2.rateRevision) from rate r2 where r.workId = r2.workId)
1 голос
/ 10 ноября 2011

Как насчет:

select workId, MAX(rateRevision) as MaxRevision
from MyTable
group by workId

Результаты:

workId  MaxRevision
1       3
2       1
3       2
4       3

Крис дал вам самый лучший и простой ответ, я думаю.Если у вас сложная ситуация, когда вы хотите удалить дубликаты (например, сохранить 5 самых последних ревизий, удалить все остальные), вы можете использовать CTE для добавления порядкового «номера строки», что-то вроде этого.

WITH CTE AS
(
    SELECT workId, 
           rateRevision,
           ROW_NUMBER() OVER(PARTITION BY workId ORDER BY rateRevision DESC) AS Ordinal
    FROM MyTable
)
DELETE FROM CTE
WHERE Ordinal > 5   -- You can keep the top "N" records (here we are just keeping the top 5)
...