Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 удаление повторов (оптимальное решение)  [new]
linav
Guest
Здравствуйте, подскажите, можно ли решить более оптимальней.
Изменять таблицы - нельзя (т.е. добавить индекс и т.п. не представляется возможным)
Задача - удалить повторяющиеся строки. Проверяется по полю dt, а то, что в поле f1 не влияет. Правильной из одинаковых считается та запись, у которой наименьшее id.
Если я правильно понимаю, то здесь самым неоптимальным является то, что поле dt не индексировано. Можно ли как-то ускорить?
MSSQL 2008

if (select object_id('#t')) is not null
    drop table #t

create table #t (
	id int identity primary key clustered,
	dt datetime not null,
	f1 int)

insert into #t (dt, f1)
	select '20140101 0:00:01', 10 union all
	select '20140101 0:00:02', 11 union all
	select '20140101 0:00:03', 12 union all
	select '20140101 0:00:04', 13 union all
	select '20140101 0:00:01', 14 union all	-- дубликат
	select '20140101 0:00:03', 15 union all	-- дубликат
	select '20140101 0:00:01', 16 union all	-- дубликат
	select '20140101 0:00:05', 17 union all
	select '20140101 0:00:06', 18 union all
	select '20140101 0:00:07', 19 union all
	select '20140101 0:00:07', 20			-- дубликат

select * from #t

delete from #t 
	where id in (
		select t0.id
			from 
				#t t0 inner join 
				(select dt from (select dt, sum(1) qty from #t group by dt) t1 where qty > 1) t2 
				on t0.dt = t2.dt 
			where t0.id not in (select min(id) from #t group by dt))

select * from #t

drop table #t
10 фев 14, 12:54    [15545681]     Ответить | Цитировать Сообщить модератору
 Re: удаление повторов (оптимальное решение)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
можно ,написать в строке поиска по форуму - Удаление дубликатов
10 фев 14, 12:56    [15545690]     Ответить | Цитировать Сообщить модератору
 Re: удаление повторов (оптимальное решение)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WITH CTE(N)AS(SELECT ROW_NUMBER()OVER(PARTITION BY dt ORDER BY id)FROM #t)
DELETE CTE WHERE N>1;
10 фев 14, 12:59    [15545723]     Ответить | Цитировать Сообщить модератору
 Re: удаление повторов (оптимальное решение)  [new]
Glory
Member

Откуда:
Сообщений: 104751
delete a
from #t a inner join #t b on a.dt = b.dt and a.id > b.id
10 фев 14, 12:59    [15545730]     Ответить | Цитировать Сообщить модератору
 Re: удаление повторов (оптимальное решение)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DELETE T
FROM @t T
WHERE EXISTS(SELECT * FROM #t TT WHERE TT.dt=T.dt AND TT.id<T.id);
10 фев 14, 13:02    [15545741]     Ответить | Цитировать Сообщить модератору
 Re: удаление повторов (оптимальное решение)  [new]
linav
Guest
Супер!
Спасибо!
10 фев 14, 13:06    [15545768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить