SQL Server 重复

SQL Server Duplicate

提问人:upwork_abid 提问时间:11/13/2023 最后编辑:GSergupwork_abid 更新时间:11/14/2023 访问量:68

问:

我需要在一个名为 的表中查找重复项,该表包含大约 100k 条记录。重复项在列中具有相似的值,例如:leadcompany

enter image description here

目标是仅保留最新的(在本例中为 95803)。但是,95803 存在一个问题,它在空格后有一些额外的字符。leadidleadid

我尝试使用以下脚本,但它没有提供所需的结果:

select t1.*
FROM [dbo].[LEAD] t1
LEFT JOIN (
    SELECT
        company,
        city,
        MAX(leadid) AS keep_leadid
    FROM [dbo].[LEAD]
    GROUP BY company, city
) t2 ON t1.company = t2.company AND t1.city = t2.city
WHERE t1.leadid <> t2.keep_leadid 
  AND t1.company LIKE '%Uvalde Country%'

如果能协助完善剧本以达到预期成果,将不胜感激。

我想全部删除,除了这个:

enter image description here

有很多公司,有不同的字符串,我想对所有公司应用相同的脚本。

sql sql-server sql-server-2008 重复项

评论

2赞 GSerg 11/13/2023
市场上有相当多的软件解决方案,可以猜测一些相似的条目是否实际上是重复的。你不会仅仅“完善剧本”而侥幸逃脱。
1赞 Charlieface 11/13/2023
请不要发布代码或数据的图像,只能粘贴文本。
1赞 Thom A 11/13/2023
真的还在使用 SQL Server 2008 吗?该版本早在 2019 年就完全不受支持;现在使用这样的版本对您和您的客户来说是一个严重的问题。
1赞 Charlieface 11/13/2023
假设唯一的问题是字符串比其他字符串长(但前缀相同),这是可能的。
0赞 Thom A 11/13/2023
也许你可以举出不止一个例子,大概可以证明你所拥有的不同场景?我敢肯定@Charlieface对这个问题有一个解决方案,我也是,但这取决于他们的警告。如果您的值为“Uvalde CC”或“Country Club, Uvalde”,则无法正常工作。

答:

0赞 Alex 11/13/2023 #1

这里有一个尝试,但需要注意的是,你对最短的公司名称感兴趣,并将与以最短的公司名称开头的公司相匹配,也不考虑城市:

declare @t table([sid] int not null identity(1,1), leadid int, company varchar(80));

insert into @t values(1,'company A');
insert into @t values(30,'company A INC');
insert into @t values(5,'company B');
insert into @t values(9,'company C');
insert into @t values(48,'company C INC');

--query to see join on companies that start with the same string
select *
from 
    @t a
    LEFT join @t b on a.company = left(b.company, len(a.company))

;WITH CTE AS
(
    --get max id per company
    select MAX(case when a.leadid > b.leadid then a.leadid else b.leadid end) max_id, 
    case when len(a.company) < len(b.company) then a.company else b.company end company,
    case when len(a.company) < len(b.company) then len(a.company) else len(b.company) end len_company
    from 
        @t a
        inner join @t b on a.company = left(b.company, len(a.company))
    group by --group by shortest company?
        case when len(a.company) < len(b.company) then a.company else b.company end,
        case when len(a.company) < len(b.company) then len(a.company) else len(b.company) end
), CTE2 AS
(
    --ROW NUMBER ON SHORTEST COMPANIES TO DISCARD ONES WITH MORE CHARACTERS AT THE END
    select max_id, MAX(company) company, ROW_NUMBER() OVER(PARTITION BY max_id ORDER BY MIN(len_company)) rn
    from CTE
    group by max_id, len_company
)
SELECT max_id, company
FROM 
    CTE2 
where
    rn = 1;