如何基于字符串从SQL Server中删除重复项

3

从SQL表中删除重复项

示例: 输入:

EID EName ....  ERole    
1    Nani       SQL    
2    Nani       SQL Developer     
3    Suresh     ASP .Net Developer     
4    Suresh     ASP .Net    
5    Ravi       Sales Force    
6    Ravi       Sales Force developer 

我有类似于上面的数据集,
输出:
EID EName ....  ERole     
2    Nani       SQL Developer     
3    Suresh     ASP .Net Developer     
6    Ravi       Sales Force developer 

注意上面的例子:

ERole列中,如果前10个字符匹配,则应为重复项。


在 ERole 列中,如果前 10 个字符匹配,则应视为重复。那么为什么 SQL 是重复的呢? - Raymond Nijland
选择 * 从 #Table1 其中 designation 像 '%Developer%' - Chanukya
以上是一个例子, - Nani
高级架构师高级架构师 PMP 101高级架构师 新PMP - Nani
高级架构师,高级架构师PMP 101,高级架构师新PMP。根据我的需求,在这三个角色中,前10个字符相同,因此我只需要考虑1条记录。 - Nani
6个回答

2

首先,我会为您设置一个示例,以便您进行测试。

最初的回答将被翻译成“Original Answer”。

CREATE TABLE #example
(
    EID INT PRIMARY KEY IDENTITY,
    EName VARCHAR(100),
    ERole VARCHAR(MAX)
)

INSERT INTO 
    #example
VALUES
    ('Nani','SQL'),
    ('Nani','SQL Developer'),
    ('Suresh','ASP .Net Developer'),
    ('Suresh','ASP .Net'),
    ('Ravi','Sales Force'),
    ('Ravi','Sales Force developer')

如果您想按照您的条件(相同的Ename,ERole前10个字符相同)删除重复记录,则可以使用以下方法:

现在,最初的回答是:

WITH grouped_example as (
SELECT
        ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
        EID
    FROM #example
)
DELETE FROM grouped_example where preserve <> 1

如果您想要选择不重复的内容,可以使用以下方法:

SELECT DISTINCT

WITH grouped_example as (
SELECT
        ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
        *
    FROM #example
)
SELECT EID,EName,ERole FROM grouped_example where preserve = 1

*注意:我使用ORDER BY ERole DESC,这样我们就能保留更多信息(更多字符)的角色 *注意2:您可以更改SUBSTRING()的最后一个值以匹配所需的字符数

"原始答案"

1

在ERole列中,如果前10个字符匹配,则应视为重复。

WITH CTE AS
(
  SELECT *, 
         ROW_NUMBER() OVER(PARTITION BY LEFT(EROle, 10) ORDER BY EID) RN
  FROM T
)
DELETE T 
FROM CTE INNER JOIN T
ON CTE.EID = T.EID
WHERE RN > 1;

0

关于您的数据,您可以使用:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.ename = t.ename and
                        t.erole like t2.erole + '%' and
                        t.eid < t2.eid
                 );

这不包括“前十个字符”的限制。但我怀疑它实际上做了你想要的事情。


高级架构师,高级架构师PMP 101,高级架构师新PMP。根据我的需求,在这三个角色中,前10个字符相同,因此我只需要考虑1条记录。 - Nani

0

根据数据集,如果名称严格限定于一个角色,则以下内容将起作用

with cte as
(
select *,row_number()over(partition by ename order by ename) rn
from table_name
) delete from cte where rn>1

高级架构师,高级架构师PMP 101,高级架构师新PMP。根据我的要求,在这三个角色中,前10个字符相同,因此我只需要考虑一条记录。 - Nani

0

在查看数据集后,这应该适用于您!

CREATE TABLE test 
(
EID int,
ENAME VARCHAR(20),
EROLE  VARCHAR(30));

INSERT INTO test
VALUES (1,'NANI','SQL'),
        (2,'NANI','SQL DEVELOPER'),
        (3,'Suresh','ASP .NET Developer'),
        (4,'Suresh', 'ASP .Net'),
        (5, 'Ravi', 'Sales Force'),
        (6, 'Ravi', 'Sales Force developer');

DELETE FROM test
WHERE EID IN(
SELECT EID FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ENAME ORDER BY LEN(EROLE) DESC) as RN
from #test) tab1 WHERE RN != 1);

SELECT * FROM test

0

试试这个

 with cte as
(
select *,row_number()over(partition by LEFT(EROle, 10) order by left(EROle, 10) rn
from  T
) delete from cte where rn=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接