Если вы говорите SQL
(язык структурированных запросов), но на самом деле имеете в виду SQL Server
(система баз данных Microsoft), а если вы используете SQL Server 2005 или более новую версию, вы можете использовать CTE (CommonТаблица Expression) для этой цели.
С помощью этого CTE вы можете разделить ваши данные по некоторым критериям - например, ItemId
(или комбинация столбцов) - и иметь номер SQL Server для всех ваших строк, начиная с 1для каждого из этих разделов, упорядоченных по некоторым другим критериям - то есть, вероятно, version
(или некоторый другой столбец).
Так что попробуйте что-то вроде этого:
;WITH PartitionedData AS
(
SELECT
itemid, fieldid, version,
ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY version DESC) AS 'RowNum'
FROM dbo.VersionedFields
)
DELETE FROM PartitionedData
WHERE RowNum > 1
По сути, выразделение ваших данных по некоторым критериям и нумерация каждого раздела, начиная с 1 для каждого нового раздела, упорядоченного по некоторым другим критериям (например, Дата или версия).
Таким образом, для каждого «раздела» данных «самый новый»запись имеет RowNum = 1, и любые другие, принадлежащие к одному и тому же разделу (с помощью одинаковых значений partitino), будут иметь последовательно пронумерованные значения от 2 до любого числа r.В этом разделе есть записи.
Если вы хотите сохранить только самую новую запись - удалите что-нибудь с RowNum больше 1, и все готово!