Исключить минимальные значения из группы - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблица MyTable (Id, LocationId, UserName, Date, Rank)

Мне нужно удалить дубликаты из этой таблицы, но оставил строку с идентификатором min

select min(cr.id)
from MyTable mt
group by mt.LocationId, mt.UserName, mt.Date, mt.Rank
having count(mt.id) > 1

Этозапрос для выбора минимальных значений из группы ... Но не знаю, как исключить их из запроса с дубликатами

select mt.LocationId, mt.UserName, mt.Date, mt.Rank
from MyTable mt
group by mt.LocationId, mt.UserName, mt.Date, mt.Rank
having count(mt.id) > 1

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Использовать row_number ()

 delete m from 
 (select mt.id, mt.LocationId, mt.UserName, mt.Date, mt.Rank,
 row_number() over(partion by mt.LocationId, mt.UserName, mt.Date, mt.Rank 
 order by mt.id) as rn
 from MyTable mt) m where rn<>1
0 голосов
/ 04 октября 2018

Вы можете использовать row_number оконную функцию

with t1 as
(
select * , 
row_number() over(partition by mt.LocationId, mt.UserName, mt.Date, mt.Rank order by Id) as rn from MyTable mt
) delete from t1 where t1.rn!=1
0 голосов
/ 04 октября 2018

Вы можете использовать CTE и ROW_NUMBER() Функция ROW_NUMBER() OVER () ищет строки с одинаковыми значениями столбцов дубликатов.Первому вхождению этой комбинации столбцов присваивается rn из 1, следующим 2, 3 и так далее.При упорядочении по возрастанию Id у вас будет наименьшее значение при rn = 1, поэтому при удалении where rn > 1 удаляются дубликаты и сохраняется строка с наименьшим идентификатором.

with cte as (
    select
        *
        ,rn = ROW_NUMBER() over (PARTITION BY LocationId, UserName, Date, Rank order by id asc)
    from MyTable 
)
delete from cte where rn > 1
0 голосов
/ 04 октября 2018

Я бы использовал row_number() функцию:

delete mt
from (select mt.*,
             row_number() over (partition by mt.LocationId, mt.UserName, mt.Date, mt.Rank order by mt.id) as seq
      from MyTable mt
     ) mt
where seq > 1;
...