Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление дублирующих записей с условием  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Всем привет,
Допустим, есть таблица:
declare @T table (id int, opId int, TotalQwt int, OpDate Date) 
insert into @T values(1, 1, 45, '2005-06-15')
insert into @T values(2, 1, 75, '2005-06-15')
insert into @T values(3, 1, 15, '2005-06-15')
insert into @T values(4, 1, 145, '2005-06-17')
insert into @T values(5, 1, 245, '2005-06-15')
insert into @T values(6, 2, 35, '2005-06-15')
insert into @T values(7, 2, 452, '2005-06-15')
insert into @T values(8, 2, 4, '2005-06-15')
insert into @T values(9, 2, 143, '2005-06-19')
insert into @T values(10, 2, 8, '2005-06-15')
select * from @T

Я хочу удалить дубликаты по двум полям opId AND OpDate, и при этом оставить запись с максимальной TotalQwt в течении дня.
Я пока дошел до такого варианта:
delete from p from @T p, @T t
where p.opId = t.opId
         and p.OpDate = t.OpDate
         and p.id > t.id
select * from @T
Здесь удаляются дубликаты, но как добавить условие, чтобы оставшаяся запись была с максимальной TotalQwt в течении дня?
22 июн 11, 10:58    [10852236]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SET NOCOUNT ON;
declare @T table (id int, opId int, TotalQwt int, OpDate Date) 
insert into @T values(1, 1, 45, '2005-06-15')
insert into @T values(2, 1, 75, '2005-06-15')
insert into @T values(3, 1, 15, '2005-06-15')
insert into @T values(4, 1, 145, '2005-06-17')
insert into @T values(5, 1, 245, '2005-06-15')
insert into @T values(6, 2, 35, '2005-06-15')
insert into @T values(7, 2, 452, '2005-06-15')
insert into @T values(8, 2, 4, '2005-06-15')
insert into @T values(9, 2, 143, '2005-06-19')
insert into @T values(10, 2, 8, '2005-06-15');
select * from @T;

WITH CTE(N)AS(SELECT ROW_NUMBER()OVER(PARTITION BY opId,OpDate ORDER BY TotalQwt DESC) FROM @T)
DELETE CTE
WHERE N>1;

select * from @T;
22 июн 11, 11:04    [10852283]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Kudep,

delete from p from @T p, @T t
where p.opId = t.opId
         and p.OpDate = t.OpDate
         and p.TotalQwt < t.TotalQwt
select * from @T
22 июн 11, 11:09    [10852327]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Guf,

Да, я не прав. Дубли останутся, если попадутся одинаковые TotalQwt.
[sql]
insert into @T values(9, 2, 143, '2005-06-19')
insert into @T values(9, 2, 143, '2005-06-19')
[/sql]
22 июн 11, 11:13    [10852356]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
insert into @T values(9, 2, 143, '2005-06-19')
insert into @T values(11, 2, 143, '2005-06-19')
22 июн 11, 11:14    [10852366]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Guf
insert into @T values(9, 2, 143, '2005-06-19')
insert into @T values(11, 2, 143, '2005-06-19')
Вы зря мучаетесь. Ведь у Kudep - SQL 2008
22 июн 11, 11:28    [10852498]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дублирующих записей с условием  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
iap, спасибо
22 июн 11, 11:30    [10852516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить