如何基于字符串从sql server中删除重复项

如何基于字符串从sql server中删除重复项,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,从SQL表中删除重复项 例如: i/p: 我有上面这样的数据集 输出: EID EName .... ERole 2 Nani SQL Developer 3 Suresh ASP .Net Developer 6 Ravi Sales Force developer 注:以上是一个示例: 在ERole列中,如果前10个字符匹配,则应为重复字符。根据数据集,如果名称严格限定为一个角色,则以下字符将起作用 wit

从SQL表中删除重复项

例如: i/p:

我有上面这样的数据集

输出:

EID EName ....  ERole     
2    Nani       SQL Developer     
3    Suresh     ASP .Net Developer     
6    Ravi       Sales Force developer 
注:以上是一个示例:


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

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

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

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

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
                 );
这不包括前十个字符的限制。但我怀疑它真的能满足你的需求

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


首先,我将设置您的示例,以便您可以测试它

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
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:您可以更改需要匹配的字符数,在查看数据集后更改子字符串的最后一个值,这应该对您有用

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
试试这个

 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

在ERole列中,如果前10个字符匹配,则应为重复字符。那么为什么SQL是重复的呢?从表1中选择*,其中上面的“%Developer%”只是一个例子,高级架构师高级架构师PMP 101高级架构师新PMP高级架构师PMP 101高级架构师新PMP,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录——高级建筑师、高级建筑师PMP 101、高级建筑师新PMP,我有这样的角色,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录高级架构师,高级建筑师PMP 101,高级建筑师新PMP我有这样的角色,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录。
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
 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