Для этого можно использовать оператор MERGE.
Как и в случае с оператором UPDATE, его можно комбинировать с выражением Common-Table-Expression.
И в CTE могут использоваться оконные функции.
;WITH CTE AS
(
SELECT *,
ROW_NUMBER() OVER (partition by Col1 order by Quantity) as rn,
SUM(Quantity) OVER (partition by Col1) as TotalQuantity,
COUNT(*) OVER (partition by Col1) as Cnt
FROM TestTable
)
MERGE (SELECT * FROM CTE WHERE cnt > 1) target
USING (SELECT * FROM CTE WHERE cnt > 1 AND rn = 1) src
ON (src.Col1 = target.Col1 AND src.rn = target.rn)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
WHEN MATCHED
THEN UPDATE SET target.Quantity = source.TotalQuantity;
Тест на rexrester здесь
Однако такое утверждение будет обновлять все записи таблицы при каждом повторном запуске. Даже когда дубли уже были удалены.
Но с несколькими настройками это станет запросом MERGE, который не обновляет те, у которых нет ошибок.
;WITH CTE AS
(
SELECT *
FROM
(
SELECT Col1, Quantity,
ROW_NUMBER() OVER (partition by Col1 order by Quantity DESC) as rn,
COUNT(*) OVER (partition by Col1) as cnt,
SUM(Quantity) OVER (partition by Col1) as TotalQuantity
FROM TestTable
) q
WHERE cnt > 1
)
MERGE CTE t
USING (SELECT * FROM CTE WHERE rn = 1) src
ON (src.Col1 = t.Col1 AND src.rn = t.rn)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
WHEN MATCHED
THEN UPDATE SET t.Quantity = src.TotalQuantity;