Как найти повторяющиеся записи и удалить самые старые в SQL? - PullRequest
4 голосов
/ 25 марта 2009

У меня есть таблица с уникальными строками, за исключением одного значения в одном столбце (назовем его «Имя»). Другим столбцом является «Дата», в которой указана дата добавления в базу данных.

Что я хочу сделать, это найти дубликаты значений в «Имя», а затем удалить те, которые имеют самые старые даты в «Дата», оставив самое последнее.

Похоже на относительно простой запрос, но я знаю очень мало о SQL, кроме простых запросов.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 25 марта 2009

Найти дубликаты и удалить самую старую

alt text

Вот код

create table #Product (
    ID      int identity(1, 1) primary key,
    Name        varchar(800),
    DateAdded   datetime default getdate()
)

insert  #Product(Name) select 'Chocolate'
insert  #Product(Name,DateAdded) select 'Candy', GETDATE() + 1
insert  #Product(Name,DateAdded) select 'Chocolate', GETDATE() + 5
select * from #Product

;with Ranked as (
    select  ID, 
        dense_rank() 
        over (partition by Name order by DateAdded desc) as DupeCount
    from    #Product P
)
delete  R
from    Ranked R
where   R.DupeCount > 1

select * from #Product
5 голосов
/ 25 марта 2009

удалить из таблицы a1 где существует (выберите * из таблицы a2, где a2.name = a1.name и a2.date> a1.date)

0 голосов
/ 25 марта 2009

Скорее всего, вы могли бы достичь этого с помощью самостоятельного объединения и НЕ НУЛЯ.

Присоединение к запросам DELETE может быть немного опасным, поскольку чем сложнее, тем больше риск удаления, чем вы намереваетесь в некоторых обстоятельствах.

Но я бы подошел к этому как.

DELETE
  a.*
FROM
  mytable AS a
  LEFT JOIN mytable AS b ON
    b.date > a.date
    AND (b.name=a.name OR (b.date = a.date AND b.rowid>a.rowid))
WHERE
  AND b.rowid IS NOT NULL

Объединение и IS NOT NULL находят каждую строку, для которой существует более новая строка с тем же именем. Он также правильно обрабатывает случай двух строк с одинаковой датой - если они имеют одинаковую дату, то он идет по rowid (что бы это ни было).

Надеюсь, что-то подобное работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...