我有一个表,除了一列中的一个值外,它们都是唯一的行(我们称之为'Name')。另一列是'Date',它是添加到数据库的日期。
我想要做的是在“名称”中找到重复的值,然后删除“日期”中具有最早日期的那些,留下最新的日期。
看起来像一个相对简单的查询,但除了简单的查询之外,我对SQL知之甚少。
有什么想法吗?
答案 0 :(得分:5)
从表a1中删除 存在的地方(从表a2中选择*,其中a2.name = a1.name和a2.date> a1.date)
答案 1 :(得分:5)
查找重复项并删除最旧的
这是代码
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
答案 2 :(得分:0)
您可以使用自连接和IS NOT NULL来实现此目的。
加入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
join和IS NOT NULL查找存在具有相同名称的较新行的每一行。它还处理两行具有相同日期的情况 - 如果它们具有相同的日期,那么它将通过rowid(无论是什么)。
希望这样的事情有效。
答案 3 :(得分:0)
我刚刚在Google上搜索并发现了这个https://www.sqlshack.com/different-ways-to-sql-delete-duplicate-rows-from-a-sql-table/
对我来说,这似乎是最容易阅读/理解的
DELETE FROM [SampleDB].[dbo].[Employee]
WHERE ID NOT IN
(
SELECT MAX(ID) AS MaxRecordID
FROM [SampleDB].[dbo].[Employee]
GROUP BY [FirstName],
[LastName],
[Country]
);
在您的情况下,您可以按名称分组并选择最大日期而不是ID