【问题标题】:how to remove duplicates from sql server based on string如何根据字符串从sql server中删除重复项
【发布时间】:2019-04-01 12:34:10
【问题描述】:

从 SQL 表中删除重复项

示例: 我/p:

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 是重复的呢?
  • select * from #Table1 where designation like '%Developer%'
  • 以上只是一个例子,
  • 高级架构师高级架构师PMP 101高级架构师新PMP
  • 高级建筑师,高级建筑师 PMP 101,高级建筑师新 PMP 我有一个像上面这样的角色,根据我在这三个角色中的要求,前 10 个字符是相同的,所以我只需要考虑 1 条记录 -

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

首先我要设置您的示例,以便您对其进行测试。

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:你可以改变你需要匹配的字符数,改变SUBSTRING()的最后一个值

【讨论】:

    【解决方案2】:

    在 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;
    

    【讨论】:

      【解决方案3】:

      根据数据集,如果名称对一个角色严格,则以下将起作用

      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 个字符是相同的,所以我只需要考虑 1 条记录 -
      【解决方案4】:

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

      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 条记录跨度>
      【解决方案5】:

      查看数据集后,这应该对您有用!

      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
      

      【讨论】:

        【解决方案6】:

        试试这个

         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
        

        【讨论】:

          猜你喜欢
          • 2017-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-09
          • 2023-03-10
          • 1970-01-01
          • 2021-12-08
          • 1970-01-01
          相关资源
          最近更新 更多